![设计模式就该这样学:基于经典框架源码和真实业务场景](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/33114758/b_33114758.jpg)
上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类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_64.jpg?sign=1738888216-Vdtp355eZ47KGYhTu6u1LsA3EumW34X7-0-37f98eed18399b5f4b98ba315b3345ba)
创建ProductDao类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_65.jpg?sign=1738888216-r1a7iKLXpSzyBnpgYutahCyMO1S2KxRL-0-62684e9381196dfad80fa8f4749b9a8e)
这是一种非常典型的合成复用原则应用场景。但是,对于目前的设计来说,DBConnection还不是一种抽象,不便于系统扩展。目前的系统支持MySQL数据库连接,假设业务发生变化,数据库操作层要支持Oracle数据库。当然,我们可以在DBConnection中增加对Oracle数据库支持的方法,但是这违背了开闭原则。其实,可以不必修改Dao的代码,将DBConnection修改为abstract,代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_66.jpg?sign=1738888216-dYq9RK2g10mNOTcMlGzuYah1uZS8gRvV-0-6cce6e49a38992804664d2f00396db34)
然后将MySQL的逻辑抽离。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_67.jpg?sign=1738888216-9i7ZAsxvCI8A9s1DSVt79J5lGx6PE3gV-0-11ac74cf43aa5b13c9e07d832866a39b)
再创建Oracle支持的逻辑。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_68.jpg?sign=1738888216-3siAlzUDtX06bwHE0VqlQVjYQVzZRaTV-0-7b681cb99bec30e000d851566361a21b)
具体选择交给应用层,来看如下图所示的类图。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_69.jpg?sign=1738888216-uPinBXzUlADUb6RTN8ZaNgUprKTrRFHb-0-2f93ed64910327470dc727780f6c829b)