
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.7 合成复用原则
3.7.1 合成复用原则的定义
合成复用原则(Composite/Aggregate Reuse Principle,CARP)指尽量使用对象组合(has-a)或对象聚合(contanis-a)的方式实现代码复用,而不是用继承关系达到代码复用的目的。合成复用原则可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小。
继承,又被称为白箱复用,相当于把所有实现细节暴露给子类。组合/聚合又被称为黑箱复用,对类以外的对象是无法获取实现细节的。我们要根据具体的业务场景来做代码设计,其实也都需要遵循面向对象编程(Object Oriented Programming,OOP)模型。
3.7.2 使用合成复用原则解决实际问题
还是以数据库操作为例,首先创建DBConnection类。

创建ProductDao类。

这是一种非常典型的合成复用原则应用场景。但是,对于目前的设计来说,DBConnection还不是一种抽象,不便于系统扩展。目前的系统支持MySQL数据库连接,假设业务发生变化,数据库操作层要支持Oracle数据库。当然,我们可以在DBConnection中增加对Oracle数据库支持的方法,但是这违背了开闭原则。其实,可以不必修改Dao的代码,将DBConnection修改为abstract,代码如下。

然后将MySQL的逻辑抽离。

再创建Oracle支持的逻辑。

具体选择交给应用层,来看如下图所示的类图。
