08. 合成复用原则

标准定义

合成复用原则(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();
  }
}

这样,当父类中有所改变,那么就会马上传播到子类当中,也就保证了子类的健壮性了。

https://www.jianshu.com/p/57c5be9d542c

你可能感兴趣的:(08. 合成复用原则)