设计模式六大原则/接口设计六大原则 之 组合/聚集复用原则(转)
2016-04-11 15:03
363 查看
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP).组合和聚合都是对象建模中关联(Association)关系的一种.聚合表示整体与部分的关系,表示“含有”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。在合成关系中,部分和整体的生命周期一样,组合的新的对象完全支配其组成部分,包括他们的创建和销毁。一个合成关系中成分对象是不能与另外一个合成关系共享。
组合/聚合和继承是实现复用的两个基本途径。合成复用原则是指尽量使用合成/聚合,而不是使用继承。
只有当以下的条件全部被满足时,才应当使用继承关系。
1. 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
2 .永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
3 .子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
错误的使用继承而不是合成/聚合的一个常见原因是错误地把“Has-A”当成了“Is-A”.”Is-A”代表一个类是另外一个类的一种;而“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。
我们需要办理一张银行卡,如果银行卡默认都拥有了存款、取款和透支的功能,那么我们办理的卡都将具有这个功能,此时使用了继承关系:
![](https://pic002.cnblogs.com/images/2012/194720/2012020813432088.jpg)
为了灵活地拥有各种功能,此时可以分别设立储蓄卡和信用卡两种,并有银行卡来对它们进行聚合使用。此时采用了合成复用原则:
![](https://pic002.cnblogs.com/images/2012/194720/2012020813435127.jpg)
原文转自 http://www.cnblogs.com/shaosks/archive/2012/02/08/2342593.html
组合/聚合和继承是实现复用的两个基本途径。合成复用原则是指尽量使用合成/聚合,而不是使用继承。
只有当以下的条件全部被满足时,才应当使用继承关系。
1. 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
2 .永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
3 .子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
错误的使用继承而不是合成/聚合的一个常见原因是错误地把“Has-A”当成了“Is-A”.”Is-A”代表一个类是另外一个类的一种;而“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。
我们需要办理一张银行卡,如果银行卡默认都拥有了存款、取款和透支的功能,那么我们办理的卡都将具有这个功能,此时使用了继承关系:
![](https://pic002.cnblogs.com/images/2012/194720/2012020813432088.jpg)
为了灵活地拥有各种功能,此时可以分别设立储蓄卡和信用卡两种,并有银行卡来对它们进行聚合使用。此时采用了合成复用原则:
![](https://pic002.cnblogs.com/images/2012/194720/2012020813435127.jpg)
原文转自 http://www.cnblogs.com/shaosks/archive/2012/02/08/2342593.html
相关文章推荐
- 改变UIView 的位置 Center和Frame
- 配置Mailgraph_ext,使用Extman的图形日志
- UItableview控件数据刷新,指定行刷新
- 简单的第三方授权
- 如何判断Javascript对象是否存在
- NFC framework introduce
- UVA10405最长公共子序列
- 单页面应用跳转页面方式
- js 之 this call apply
- 内存管理 -- 高质量编程
- input 中某些属性的使用
- 改变textfieldplaceHoder颜色
- IOS如何给VIEW设置2个圆角?set cornerRadius for only top-left and top-right corner of a UIVIEW
- 在eclipse中导入别人的安卓项目出现中文乱码问题
- APK瘦身记,如何实现高达53%的压缩效果
- 有关SQL*PLUS命令使用大全
- android 水准仪的实现(方向传感器的使用)
- FZU - 1894 志愿者选拔 单调队列
- Android PullToRefresh 的基本介绍
- EBS表后缀的意义