复合复用原则(Composite/AggregateReusePrinciple,CARP)是指使用对象组合(has-a)/聚合(contanis-a)代替继承关系来达到软件复制使用目的。它可以使系统更加灵活,降低类之间的耦合度,一个类的变化对其他类的影响相对较小。继承称为白盒复用,相当于把所有的实现细节都暴露给子类。组合/聚合称为黑盒复用,我们无法获取类以外的对象的实现细节。虽然我们需要根据具体的业务场景进行代码设计,但也需要遵循OOP模型。以数据库操作为例,首先创建DBConnection类:publicclassDBConnection{publicStringgetConnection(){return"MySQLdatabaseconnection";}}创建ProductDao类:publicclassProductDao{privateDBConnectiondbConnection;publicvoidsetDbConnection(DBConnectiondbConnection){this.dbConnection=dbConnection;}publicvoidaddProduct(){Stringconn=dbConnection.getConnection();System.out.println("使用"+conn+"添加商品");}}这是一个非常典型的组合复用原则的应用场景。但是就目前的设计而言,DBConnection并不是一个抽象,不便于系统扩展。当前系统支持MySQL数据库连接。如果业务发生变化,数据库操作层必须支持Oracle数据库。当然我们可以在DBConnection中加入对Oracle数据库的支持,但是这样就违背了开闭原则。其实我们可以把DBConnection改成“抽象”的,不用修改Dao的代码。看代码:publicabstractclassDBConnection{publicabstractStringgetConnection();}然后提取MySQL的逻辑:publicclassMySQLConnectionextendsDBConnection{@OverridepublicStringgetConnection(){return"MySQLdatabaseconnection";}}创建Oracle支持:publicclassOracleConnectionextendsDBConnection{@OverridepublicStringgetConnection(){return"Oracledatabaseconnection";对于应用层,看一下类图,如下图所示。本文为《汤姆炸弹建筑》原创,转载请注明出处。科技在于分享,我分享我的快乐!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。关注微信公众号“汤姆炸弹架构”,获取更多技术干货!【推荐】汤姆炸弹架构:收藏此文相当于收藏一本《设计模式》书其他设计原则汤姆炸弹架构:开闭原则(OCP)汤姆炸弹架构:单一职责(SimpleResponsibilityPrinciple,SRP)汤姆炸弹架构:接口隔离原则(InterfaceSegregationPrinciple,ISP)汤姆炸弹架构:迪米特法则(LawofDemeterLoD)汤姆炸弹架构:里氏里氏替换原则(LSP))
