1. 委派/委托:一个对象请求另一个对象的功能
委派是复用的一种常见形式
一个简单例子:
正如一下所示:
Receiver 对象将操作委派给Delegate对象执行。
Client调用Receiver,而不使用Delegate对象
2. 利用委派可以扩展功能:
例如:我们要建立一个LoggingList,功能与list相同,但能记录其add/remove的操作。
我们可以使用委派:
3. 委派 vs. 继承
继承:extending一个基类,通过增加一个新操作或重写一个操作。
委派:采取一个操作,并将其传递给另一个类。
例如stack继承list并不合适,而应该使用委托的方式实现其push,pop等方法。
当使用继承,子类期望使用父类的方法时:
可能出现的一个问题:例如运行以下代码
public class test { public static void main(String[] args) { B b = new B(); b.foo(); } } class A { void foo() { this.bar(); } void bar() { System.out.println("A.bar"); } } class B extends A { public B() { } void foo() { super.foo(); } void bar() { System.out.println("B.bar"); } }
本意为b调用a的方法,但由于b对a中方法涉及到的其他方法进行了重写,而达不到预期的效果。
其结果为:
而使用委托就能很好地避免这一问题。
如果子类只需要复用父类中的一小部分方法 ,
可以不需要使用继承,而是通过委派机制来实现。
如:
委托可以视为在对象层次上的复用,而继承可视为在类层次上的复用。
3. 委派的种类
1. Use(A use B)
2. Composition/aggregation(A owns B)
3. Association(A has B)
分别加以解释:
(1)Dependency:临时性的delegation
即上面所说的uses-a
只是一个临时关系,一个对象需要其他对象来实现自己。
如:
(2) Association: 永久性的delegation
即上面所说的has_a关系。
(3)Composition: 更强的delegation
delegate对象已经是receiver的一部分, 为is_part_of关系。若receiver不存在,相
应的delegate对象也不复存在。例如:
正如心脏和人的关系一样。
(4)Aggregation: 聚合。 delegate对象在receiver之外被创建,被当做参数传递给
receiver。
注:Composition vs. Aggregation
In composition, when the owning object is destroyed, so are the contained objects.
In aggregation, this is not necessarily true.