我们有一组从一组通用接口派生的类
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(); } } }