java – 把自己编成一个角落
我们有一组从一组通用接口派生的类
IFoo-> BasicFoo,ReverseFoo,ForwardFoo IBar -> UpBar,DownBar,SidewaysBar IYelp -> Yip,Yap,Yup 其中Foo的构造函数看起来像Foo(IBar,IYelp)这些项目在整个项目中使用. 存在另一个类,它的一个方法的签名是public double CalcSomething(IFoo,IAnotherClass),它被应用到每个Foo的某个点.我们已经从上面提出了一个特定对象组合的请求,让我们说一个BasicFoo(UpBar,Yip)使用与CalcSomething中不同的算法. 我的第一个本能就是说让我们改变IFoo界面,所以我们可以将逻辑下降到Foo类级别,将构造函数改为Foo(IBar,IYelp,IStrategy),然后让Foo对象封装这个逻辑.不幸的是,我们也被告知架构的设计规定,IFoo,它的实现和IAnotherClass之间没有依赖关系.他们坚持这个. 好的,当然,我以为我可能会使用一个访客模式,但…如何?制作作品的整个观点是,没有其他类可以看到实施细节.反思看看物体内部,完全打破封装?哦,该死的. 所以我来到这里,因为我很失落.有没有人有任何建议,我们如何处理一种组合的特殊情况,而不修改组成或打破封装?必须有一个简单的解决方案,我看起来太过分了. 编辑: 去除了冒犯的开始. 解决方法
根据您提供的IFoo类型选择适当算法的CalculationFactory将解决问题(以有条件为代价):
interface ICalcSomethingStrategy { public double CalcSomething(IFoo,IAnotherClass); } CalcSomethingStrategyFactory { ICalcSomethingStrategy CreateCalcSomethingStrategy(IFoo foo) { // I'm not sure whether this is the idiomatic java way to check types D: if (foo.Bar instanceof UpBar && foo instanceof Yip) { return new UnusualCalcSomethingStrategy(); } else { return new StandardCalcSomethingStrategy(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 我可以在nginx服务器上部署我的.war
- 如何使用InputMap捕获CTRL mouseWheel事件
- java – 最好的GWT CodeSplitting设计封装“模块”
- Java – Swing – JTable – 为所选行设置颜色,但不为Cell设
- java – 仅在Apache Commons CLI中需要一个参数?
- 虚拟机 – 中间表示(如字节码或.net IL)仍然是一个优势吗?
- Hadoop组件简介
- java – 无法通过测试用例从src / main / resources访问文件
- java – 根据set中的值过滤列表中的值
- java – 如何为多线程应用程序创建测试环境