委派和继承都是为了提高代码的复用性,但方式不同。
继承发生在class层面,委派发生在object层面,是对对象的操作。
继承中,子类拥有父类所有的方法,而且还可以继续增加父类中没有的方法。
如public class B extends A,B中可以新增方法,同时继承了父类A中的方法。子类只能继承一个父类,但是可以多层扩展(该子类的父类继承其父类)。
委派是针对对象的操作。一个对象需要另一个对象的功能,于是捕获该对象,发送到另一对象中调用其功能。
当我们需要切菜时,显然切这个方法写给蔬菜并不合适,因此我们交给刀来切,相当于我们把蔬菜这个对象给刀进行了处理,这就是委派。
委派常见的种类:
1.Dependency(依赖):短期的delegation
在这种关系中,一个类使用另一个类而不将其作为一个属性。它可以是一个参数,或者在一个方法中本地使用。
2.Association(关联): 永久性的delegation
关联是类之间的持久关系,允许一个对象实例让另一个对象实例代表它自己做其他事。指定了一种对象与另一种对象相连接,并且不代表行为,即不在该类的方法中使用另一个类的方法,只是简单的将不同的对象连接起来。
示例:
Composition: 更强的delegation
组合是将简单对象或数据类型组合成更复杂的方法的一种方法。
直接在该类中实例化一个其他类,然后就可以随意操作,自由度很高。
不过这里的实例是private的,也就是说,外界访问不到,这样的话,更改其值只能在该方法中;而且每次创建该类的对象时,就已经创建好这个类中的实例;也就是说一旦创建好该类的对象,其中的属性指向便已经创建好。
Aggregation
聚集:对象存在于另一个之外,是在外部创建的,所以它作为一个参数传递给构造函数。
可以看到,在这里,内部的属性是可以在外部指定的,而不是完全依赖该类。
组合和聚集对比:
在组合中,当拥有的对象被销毁时,所包含的对象也是如此。
比如:
一所大学拥有不同的部门,每个部门都有许多教授,因为是大学创建了这些部门,所以如果大学关闭,这些部门将不复存在,但这些部门的教授将继续存在。
但是在聚集中,这并不一定是正确的:
大学可以被看作是部门的组成,而院系则是教授的集合。一个教授可以在一个以上的部门工作,但是一个部门不能成为一所大学的一部分,部门是在大学外创建的,故大学倒闭,部门还在。