ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 一、定义 合成/聚合复用原则是**在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的**。 简述为:**要尽量使用合成/聚合,尽量不要使用继承**。 ## 二、具体说明 >继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合称为黑箱复用,我们是无法获取到类以外的对象的实现细节的。虽然我们要根据具体的业务场景来做代码设计,但也需要遵循 OOP 模型。以数据库操作为例,先来创建 DBConnection 类: ~~~ public class DBConnection { public String getConnection() { return "MySQL 数据库连接"; } } ~~~ 创建 ProductDao 类: ~~~ public class ProductDao { private DBConnection dbConnection; public void setDbConnection(DBConnection dbConnection) { this.dbConnection = dbConnection; } public void addProduct() { String conn = dbConnection.getConnection(); System.out.println("使用" + conn + "增加产品"); } } ~~~ 这就是一种非常典型的合成复用原则的应用场景。但是,就目前的设计来说,DBConnection 还不是一种抽象,不便于系统扩展。目前的系统支持 MySQL 数据库连接,假设业务发生变化,数据库操作层要支持 Oracle 数据库。当然,我们可以在 DBConnection 中增加对 Oracle 数据库支持的方法。但是这违背了开闭原则。其实,我们可以不必修改 Dao 的代码,将 DBConnection 修改为 abstract,来看代码: ~~~ public abstract class DBConnection { public abstract String getConnection(); } ~~~ 然后,将 MySQL 的逻辑抽离: ~~~ public class MySQLConnection extends DBConnection { @Override public String getConnection() { return "MySQL 数据库连接"; } } ~~~ 再创建 Oracle 支持的逻辑: ~~~ public class OracleConnection extends DBConnection { @Override public String getConnection() { return "Oracle 数据库连接"; } } ~~~ 具体选择交给应用层,来看一下类图: ![](https://img.kancloud.cn/6b/77/6b771ab8eeff895d2ae305385a39d258_651x285.png)