把自己编成一个角落

whe*_*ies 10 java oop design-patterns

我们有一组类,它们来自一组通用的接口

IFoo-> BasicFoo, ReverseFoo, ForwardFoo
IBar -> UpBar, DownBar, SidewaysBar
IYelp -> Yip, Yap, Yup
Run Code Online (Sandbox Code Playgroud)

其中Foo的构造函数看起来像Foo(IBar, IYelp) 这些项目在整个项目中使用.

存在另一个具有方法的类,该方法的签名public double CalcSomething(IFoo, IAnotherClass)在某一点应用于每个Foo.我们已经从上面请求了一个特定的对象组合,比如说BasicFoo(UpBar,Yip),使用不同于其中的算法CalcSomething.

我的第一个本能就是说让我们改变IFoo接口,这样我们就可以将逻辑移到Foo类级别,将构造函数改为Foo(IBar, IYelp, IStrategy),然后让Foo对象封装这个逻辑.不幸的是,我们也被告知架构的设计规定在IFoo它的实现和之间没有依赖关系IAnotherClass.他们坚持这一点.

好吧,当然,我想我可能会使用访客模式但是......怎么样?制作组合的重点是没有其他类可以看到实现细节.反思内部物体,完全打破封装?哦,该死的.

所以我来这里是因为我不知所措.有没有人有任何建议我们如何处理其中一种成分的特殊情况而不改变成分或打破封装?我必须有一个简单的解决方案.

编辑:

删除了违规的开头.将"特别处理"更改为更具描述性的含义.

Jef*_*nal 3

CalculationFactory根据您提供的类型选择适当的算法将IFoo解决问题(以条件为代价):

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)