您现在的位置是:首页 > 编程开发 > Java > Java

java – 把自己编成一个角落

编辑:站长来源:互联网作者: 佚名2020-08-05Java

简介我们有一组从一组通用接口派生的类 IFoo- BasicFoo, ReverseFoo, ForwardFooIBar - UpBar, DownBar, SidewaysBarIYelp - Yip, Yap, Yup 其中Foo的构造函数看起来像Foo(IBar,IYelp)这些项目在整个项目中使用. 存在另一个类,它的一个方法的签名是public double

我们有一组从一组通用接口派生的类

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();
        }
    }
}

很赞哦! ()