概念
委托/委派(delegation):一个对象请求另一个对象的功能,捕获一个操作并将其发送到另一个对象。
相较于继承(Inheritance)的优点
几种类型
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
课上讲了这样一道题:
我的观点是,第一个代码是聚集的方式,第二个代码是组合的方式,原因如下:
- 在组合中,当拥有的对象被销毁时,所包含的对象也是如此。
比如: - 一所大学拥有不同的部门,每个部门都有许多教授,因为是大学创建了这些部门,所以如果大学关闭,这些部门将不复存在,但这些部门的教授将继续存在。
- 但是在聚集中,这并不一定是正确的:
大学可以被看作是部门的组成,而院系则是教授的集合。一个教授可以在一个以上的部门工作,但是一个部门不能成为一所大学的一部分,部门是在大学外创建的,故大学倒闭,部门还在。 - 在第二个实例中,WebServer的构造完全依赖于类中指定的参数,不能从外界传参,所以不能是聚集。