区分委托、组合和聚合(Java OO设计)

区分委托、组合和聚合(Java OO设计),java,oop,aggregation,composition,delegation,Java,Oop,Aggregation,Composition,Delegation,我面临着一个持续不断的问题,即如何区分授权、组合和聚合,以及在哪些情况下最好使用其中一种 我查阅了一本JavaOO分析和设计书籍,但我的困惑仍然存在。主要的解释是: 委托:当我的对象按原样使用另一个对象的功能而不进行更改时 合成:我的对象由其他对象组成,而这些对象在我的对象被销毁和垃圾收集后将不存在 聚合:我的对象由其他对象组成,这些对象即使在我的对象被销毁后也可以生存 有没有可能用几个简单的例子来说明每个案例及其背后的原因?除了我的对象只是引用了另一个对象之外,还有什么其他的例子可以演示呢?在

我面临着一个持续不断的问题,即如何区分授权、组合和聚合,以及在哪些情况下最好使用其中一种

我查阅了一本JavaOO分析和设计书籍,但我的困惑仍然存在。主要的解释是:

委托:当我的对象按原样使用另一个对象的功能而不进行更改时

合成:我的对象由其他对象组成,而这些对象在我的对象被销毁和垃圾收集后将不存在

聚合:我的对象由其他对象组成,这些对象即使在我的对象被销毁后也可以生存


有没有可能用几个简单的例子来说明每个案例及其背后的原因?除了我的对象只是引用了另一个对象之外,还有什么其他的例子可以演示呢?

在这三种情况下,您的对象都会引用另一个对象。区别在于被引用对象的行为和/或生命周期。一些例子:

  • 构成:房屋包含一个或多个房间。房间的寿命由房子控制,因为没有房子房间就不存在

  • 集合:用积木建造的玩具屋。您可以将其分解,但块仍将保留

  • 代表团:你的老板让你给他弄杯咖啡,你却让一个实习生替你弄。委派不是一种关联类型(与组合/聚合类似)。后两种方法已在堆栈溢出方面进行了讨论

  • 在注释中,您询问了在每种情况下实现的不同之处,注意到在所有情况下,我们都调用相关对象上的方法。的确,在每种情况下,我们都会有如下代码

    myRoom.doWork();
    
    myBlock.doWork();
    
    myMinion.doWork();
    
    但不同之处在于相关对象的生命周期和基数

    对于构件,房间在创建房屋时即存在。所以我们可以在房子的构造中创建它们

    在关联的情况下(我将使用轮胎和汽车),汽车可能会在其构造中添加轮胎,但稍后您可能需要移除和更换轮胎。所以你也有一些方法,比如

     removeTyre(FrontLeft)
     addNewTyre(aTyre, BackRight)
    
    而且很可能aTyre物体来自一家工厂-我们没有用汽车的任何方法
    new
    it

    在委托的情况下,您甚至可能没有成员变量来保存委托

     resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);
    

    对象之间的关系仅在实习生取咖啡时持续。然后它返回到资源池。

    您的书解释得很好,所以让我详细说明并提供一些示例

    委托:当我的对象按原样使用另一个对象的功能而不更改它时

    有时,一个类在逻辑上可能需要很大。但是大班不是一个好的编码实践。有时,类的某些功能可能以多种方式实现,您可能希望在某个时候更改这些功能

    
    class FeatureHolder {
     void feature() {
      // Big implementation of the feature that you dont want to put in the class Big
     }
    }
    
    class Big {
     private FeatureHolder FH = new FeatureHolder();
    
     void feature() {
      // Delegate to FeatureHolder.
      FH.feature();
     }
    
     //.. Other features
    }
    
    从上面的示例中,Big.feature()按原样调用FH的feature,而不进行更改。这样,大类就不需要包含特性的实现(分离劳动)。另外,feature()可以由其他类(如“NewFeatureHolder”)以不同的方式实现,Big可能会选择使用新的FeatureHolder

    组合:我的对象由其他对象组成,而这些对象在我的对象被垃圾收集后就不存在了

    聚合:我的对象由其他对象组成,这些对象即使在我的对象被销毁后也可以生存

    从技术上讲,组合是“部分”关系,聚合是“引用”关系。你的手臂是你的一部分。如果你死了,你的手臂也会死。你的衣服不是你的一部分,但你拥有它们;既然你是客人,你的衣服就跟不上

    在编程中,一些对象是另一个对象的一部分,没有它它们就没有逻辑意义。例如,按钮被组合到窗口框架中。如果一个帧被关闭,按钮就没有理由再出现(构图)。按钮可以引用数据库(类似于重新读取数据);取消该按钮后,数据库可能仍然存在(聚合)

    对不起,我的英语太差了,希望这对代表团有所帮助 当
    A
    的客户端调用
    methodA
    时,类
    A
    将调用委托给
    B
    methodB

    理由。A类暴露属于其他地方的行为。这可能发生在单继承语言中,其中类A从一个类继承,但其客户机需要在另一个类中实现的行为

    混合授权 涉及简单转发的委托和作为继承替代的委托之间的区别在于被调用方必须接受调用方的参数,示例如下:

        b.methodB( this );
    
    理由。允许类
    B
    实例使用类
    A
    提供的功能,就像类
    B
    继承自类
    A
    ——但不继承一样

    作文 一旦不再存在对类
    a
    的特定实例的引用,其类
    B
    的实例将被销毁

    理由。允许类以模块化方式定义行为和属性

    聚集 一旦不再引用类
    a
    的特定实例,其类
    B
    的实例将不会被销毁。在本例中,
    A
    C
    必须在销毁
    B
    之前进行垃圾收集

    理由。允许实例重用对象

    无参考文献的论证 这些简单模式的名称是由它们的引用关系定义的。

    1)委托:人-驾驶员-汽车示例。一个人买了一辆汽车。但是那个人不知道开车。因此,他将任命一名司机
    public class A {
      private B b = new B();
    
      public void methodA() {
        b.methodB( this );
      }
    }
    
        b.methodB( this );
    
    public class A {
      private B b = new B();
    
      public A() {
      }
    }
    
    public class A {
      private B b;
    
      public A( B b ) {
        this.b = b;
      }
    }
    
    public class C {
      private B b = new B();
    
      public C() {
        A a = new A( this.b );
      }
    }