【问题标题】:Avoiding redundancy in Composition pattern java避免组合模式java中的冗余
【发布时间】:2015-06-24 07:32:56
【问题描述】:

我有两个班级 A 和 B。现在,我有 B "has a" A 关系。所以,这里要遵循的最琐碎的事情是组合模式。现在,B 的一个字段是 A 的一个对象。问题是 A 和 B 的一些字段是共同的。因此,在这种情况下,这些字段将是多余的。我不能从公共字段中创建一个抽象类并让 A 和 B 继承它,因为它们已经在扩展一些抽象类。在这种情况下,最佳做法是什么?

【问题讨论】:

  • 你是说 B 可能有也可能没有 A。只有当 B 有有效的 A 时,这些字段才是冗余的?
  • B 几乎总是有一个对应的 A。两者都有一个共同的字段,这实际上是一个文件位置,其值总是相同的。
  • 对不起,我很迂腐。几乎总是还是总是?
  • B 总是有一个对应的 A :)
  • 那么为什么不在 A 本身中包含字段 - 并使用委托方法使其对 B 的用户看起来更好。

标签: java oop inheritance design-patterns composition


【解决方案1】:

如果 A 和 B 不能有共同的基类,则不能将共同的字段放在这样的类中。

避免冗余的一种方法是创建包含 A 和 B 的公共字段的第三个 C 类,并让 A 和 B 都具有 C 类的成员。

只有当公共字段作为一个单独的类有意义时,这种重构才有意义(即,该类将代表一些现实生活中的对象或概念,而不仅仅是任意一组字段)。否则我会保留多余的字段。

例如,OfficePerson 可能没有公共基类(Object 除外),但假设它们都具有街道名称、城市、邮政编码等属性...您可以很容易地看到这些字段应该被提取到Address 类中。

【讨论】:

    【解决方案2】:

    正如你所说,你的 A 和 B 类已经扩展了一个抽象类,你可以尝试用一个非公共函数委托公共字段来区分它

    例如

    class B extends AbstractB {
         private String myField;
         public String getMyField(){
               return myField;
         }
    }
    
    class A extends AbstractA {
         private String myField;
         private B b;
         public A(B b){
            this.b = b;
         }
         public String getMyField(){
               return myField;
         }
         public String getMyBField(){
               return b.myField;
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2015-08-12
      • 1970-01-01
      • 2019-01-02
      • 2011-01-31
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多