标准定义
合成复用原则 (Composite Reuse Principle, CRP) 的定义如下:
复合优先于继承
生活案例
现在, 老是听得到富二代败家的事情, 富二代拿些父母的资产挥霍无忌, 香车美女, 酒池玉林. 到最后, 父母的公司倒闭, 欠了一屁股的债, 富二代的信用卡还得还, 曾经的酒肉朋友也离他们而去, 真是虎落平阳被犬欺负. 继承, 就是存在着这样的危险, 儿子挥霍着父亲的资产, 却不知道家里已经破产. 尤其是富二代对父母关系并不好, 沟通都没有几句, 完全不知道彼此双方的现状. 导致父亲在空荡荡的公司里, 还得望着儿子的账单生气, 商女不知亡国恨, 隔江犹唱后庭花.
面对这种情况, 富二代们可以有这样的解决办法. 第一: 和父母保持联系, 熟悉公司的运作, 熟悉父母的情况, 尤其要知道父母现在还有多少钱, 可以供其挥霍; 第二: 父亲就是一台印钞机, 想要多少钱, 就有多少钱. 通过这两种办法, 富二代可以很好地了解父母的情况, 制定好相应的挥霍计划, 而且能够及时改变.
合成复用就是类似于这样的一个场景, 子类继承了父类的所有方法, 但是如果父类当中有方法被改变了, 子类当中就找不到相应的方法, 造成子类出错. 为了避免这种情况的出现, 第一是父类专门为扩展而设计, 几乎不会改变, 并提供完整的文档 (印钞机), 第二是父类和子类在同一个包下面, 都由同一个程序员负责, 保证好父类的改变能够及时通知到子类当中 (和父母保持联系).
程序例子
具体的业务使用 04. 开闭原则当中的 CanonSimplePrinter 和 CanonHighPrinter 来举例.
- public class CanonSimplePrinter{
- public void print() {
- System.out.println("这是佳能的普通打印机, 它只能打印黑白的文档")
- }
- }
- public class CanonHighPrinter extends CanonSimplePrinter{
- public void print() {
- super.print();
- }
- }
如果有一天, CanonSimplePrinter 里面的 printer() 方法删掉了, 那么在子类中也会因为该方法被删掉而报错, 这是我们不想看到的.
怎么办?
- public class CanonSimplePrinter{
- public void print() {
- System.out.println("这是佳能的普通打印机, 它只能打印黑白的文档")
- }
- }
- public class CanonHighPrinter {
- private CanonSimplePrinter printer;
- public CanonHighPrinter(CanonSimplePrinter printer) {
- this.printer = printer;
- }
- public void print() {
- this.printer.print();
- }
- }
这样, 当父类中有所改变, 那么就会马上传播到子类当中, 也就保证了子类的健壮性了.
来源: http://www.jianshu.com/p/57c5be9d542c