合成复用原则(Composite Reuse Principle)

来源:互联网 发布:js中string转date 编辑:程序博客网 时间:2024/05/21 17:15

10.3.6  合成复用原则(Composite Reuse Principle)

合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。聚合表示整体和部分的关系,表示"拥有";合成则是一种更强的"拥有",部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和销毁等。一个合成关系的成分对象是不能与另一个合成关系共享的。

在面向对象设计中,有两种基本的办法可以实现复用:

第一种是通过合成/聚合,即合成复用原则,含义是指,尽量使用合成/聚合,而不是使用继承。

第二种就是通过继承。

要正确地选择合成/复用和继承的方法是,只有当以下的条件全部被满足时,才应当使用继承关系:

子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分"Has-A"和"Is-A"。只有"Is-A"关系才符合继承关系,"Has-A"关系应当用聚合来描述。

永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。

子类具有扩展超类的责任,而不是具有置换掉(override)或注销掉(Nullify)超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。

只有在分类学角度上有意义时,才可以使用继承。不要从工具类继承。

错误的使用继承而不是合成/聚合的一个常见原因是错误地把"Has-A"当成了"Is-A"。"Is-A"代表一个类是另外一个类的一种;"Has-A"代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。

例如,我们需要办理一张银行卡,如果银行卡默认都拥有了存款、取款和透支的功能,那么我们办理的卡都将具有这个功能,此时使用了继承关系,如图10-7所示。

 

为了灵活地拥有各种功能,此时可以分别设立储蓄卡和信用卡两种,并有银行卡来对它们进行聚合使用。此时采用了合成复用原则,如图10-8所示。


 
原创粉丝点击