BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52558同步于 2016/8/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

if-else用设计模式替代

yxcbluesky
2016/8/24镜像同步29 回复
看了回复,发现我表述的有问题,所以修改一下 A,B,C...是不同类的各一个实例,get方法也是不同,例如A的get方法可能是getA,B的get方法是getB等。 并且这种get是按照A,B,C等顺序执行下来。 然后寻求一种符合这种场景需求的设计模式,java语言哈,别的语言不会而且项目开发就是java语言~ //////////以下为原文//////////////// 代码内容: if (A.get(id) != null) return A.get(id); if (B.get(id) != null) return B.get(id); if (C.get(id) != null) return C.get(id); ... return error; 像上面这种if-else的逻辑,比较适合用哪种设计模式?设计模式这方面经验比较少,求指导
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
a206206机器人#1 · 2016/8/24
类似classLoader的delegation?有没有这种模式啊。。。不知道。
nuanyangyang机器人#2 · 2016/8/24
假设A,B,C都是一个类T的实例,T有get方法。 for (T x: new T[]{A,B,C}) { if (x.get(id) != null) return x.get(id) } return error; 顺便安利一下Scala语言: class T { def get(id: Int): Option[U] = ... } val a = new T val b = new T val c = new T return a.get(id) getOrElse b.get(id) getOrElse c.get(id) getOrElse error //或者 return Stream(a,b,c).map(_.get(id)).flatten.headOption.getOrElse(error) //或者按Java那么做 顺便安利一下Haskell things = [Nothing, Just 1, Nothing, Just 2, Nothing] result = head (catMaybes things ++ [error "This is an error]) -- 结果是1
Jason2635机器人#3 · 2016/8/24
暖神可以换回原来的头像么,看的我都方了~。。。 【 在 nuanyangyang 的大作中提到: 】 : 假设A,B,C都是一个类T的实例,T有get方法。 : [code=java] : for (T x: new T[]{A,B,C}) { : ...................
fuxuemingzhu机器人#4 · 2016/8/24
映射
dss886机器人#5 · 2016/8/24
? :
aquamarine机器人#6 · 2016/8/24
pattern matching,换scala吧
neo861002机器人#7 · 2016/8/24
如果非得用设计模式,搞个chain handler来做,前提是你返回的都是一个公共父类或者接口。最下面的默认的handler就是自己注入一个callback,对于匹配不到的错误处理方式,你的方式是返回error,当然你也可以抛异常。 如果你想做POJO的mapping,可以看看这个https://github.com/neoremind/easy-mapper
shangpengfei机器人#8 · 2016/8/24
ruby: [a, b, c].detect(&:id).id 或 [a, b, c].map(&:id).compact.first
nuanyangyang机器人#9 · 2016/8/24
【 在 shangpengfei 的大作中提到: 】 : ruby: : [a, b, c].detect(&:id).id : 或 : ................... 第二种不是懒惰的。