![设计模式就该这样学:基于经典框架源码和真实业务场景](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=1738985202-dQn2WbKk2FBPHpz1ECaXwfPNA95ejhtC-0-88e8c848355b2a00fd44aa638e539aae)
创建ProductDao类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_65.jpg?sign=1738985202-uLrUwCOCF0OL3IZhIZy9PReDspbmhWJx-0-b50efd960f0b41c773819d843494332a)
这是一种非常典型的合成复用原则应用场景。但是,对于目前的设计来说,DBConnection还不是一种抽象,不便于系统扩展。目前的系统支持MySQL数据库连接,假设业务发生变化,数据库操作层要支持Oracle数据库。当然,我们可以在DBConnection中增加对Oracle数据库支持的方法,但是这违背了开闭原则。其实,可以不必修改Dao的代码,将DBConnection修改为abstract,代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_66.jpg?sign=1738985202-F9chPnOmPKaHPka3MOTMYNhX0jujAcej-0-420f8bb9da135c1285a7dc5cde4586a0)
然后将MySQL的逻辑抽离。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_67.jpg?sign=1738985202-8Pwo0H6ShKTcGP2amzAvXkcf5dWGbjhC-0-3e2a1ca2f7084483c4c0116fd5154be8)
再创建Oracle支持的逻辑。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_68.jpg?sign=1738985202-Krsk2DnNnsdR5gHpKxdzzc96sCpdPEyM-0-6c875d66787b6d58b8bfb160273b8caf)
具体选择交给应用层,来看如下图所示的类图。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_69.jpg?sign=1738985202-0GSp7vPKrLSX1Oi3tBtuU9rSUlzGpNYZ-0-a30857c894d173df1a6c71e95eec2c6c)