概念

委托/委派(delegation):一个对象请求另一个对象的功能,捕获一个操作并将其发送到另一个对象。

相较于继承(Inheritance)的优点

java changelog delete 语句怎么写 java delegation_数据类型

几种类型

java changelog delete 语句怎么写 java delegation_数据类型_02

Composition

  • 组合是将简单对象或数据类型组合成更复杂的方法的一种方法。
  • 这种关系是a-part-of关系,一个类有另一个属性或实例变量——实现了一个对象包含另一个对象。

代码:

class Heart {
	...
}

class Person { 
    private Heart heart = new Heart();
    public void operation () { 
        heart.operation(); 
    }
}
  • 这种方式理解起来就很简单了,直接在该类中实例化一个其他类,然后该调用方法调用方法,对这个实例想怎么用怎么用,十分灵活。
  • 不过需要注意的是:
    这里的实例是private的,也就是说,外界访问不到,这样的话,更改其值只能在该方法中;而且每次创建该类的对象时,就已经创建好这个类中的实例;也就是说一旦创建好该类的对象,其中的属性指向便已经创建好。

Aggregation

  • 聚集:对象存在于另一个之外,是在外部创建的,所以它作为一个参数传递给构造函数。
  • 这种关系是has-a的关系,区别于前面的composition

代码:

class Student {
	...
}

class Course { 
    private Student[] students; 
    public addStudent (Student s) { 
        studtents.append(s); 
    } 
}
  • 可以看到,在这里,内部的属性是可以在外部指定的,而不是完全依赖该类。

Composition vs. Aggregation

课上讲了这样一道题:

java changelog delete 语句怎么写 java delegation_数据类型_03


我的观点是,第一个代码是聚集的方式,第二个代码是组合的方式,原因如下:

  • 在组合中,当拥有的对象被销毁时,所包含的对象也是如此。
    比如:
  • 一所大学拥有不同的部门,每个部门都有许多教授,因为是大学创建了这些部门,所以如果大学关闭,这些部门将不复存在,但这些部门的教授将继续存在。
  • 但是在聚集中,这并不一定是正确的:
    大学可以被看作是部门的组成,而院系则是教授的集合。一个教授可以在一个以上的部门工作,但是一个部门不能成为一所大学的一部分,部门是在大学外创建的,故大学倒闭,部门还在。
  • 在第二个实例中,WebServer的构造完全依赖于类中指定的参数,不能从外界传参,所以不能是聚集。