08. 合成复用原则
2018-06-25 本文已影响9人
Next_吴思成
标准定义
合成复用原则(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();
}
}
这样,当父类中有所改变,那么就会马上传播到子类当中,也就保证了子类的健壮性了。