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(); } } } (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |