加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 把自己编成一个角落

发布时间:2020-12-14 16:29:01 所属栏目:Java 来源:网络整理
导读:我们有一组从一组通用接口派生的类 IFoo- BasicFoo,ReverseFoo,ForwardFooIBar - UpBar,DownBar,SidewaysBarIYelp - Yip,Yap,Yup 其中Foo的构造函数看起来像Foo(IBar,IYelp)这些项目在整个项目中使用. 存在另一个类,它的一个方法的签名是public double CalcS
我们有一组从一组通用接口派生的类
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();
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读