定义
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/ 聚合(contanis-a),而不是继承关系达到软件复用的目的
类的复用一般分为两种:一种是组合/聚合,另一种则是继承。
- 继承复用的优点在于扩展性较好,子类继承父类,父类的大部分功能都可以提供给子类使用,修改和扩展相对比较容易。
- 继承复用的缺点在于这种方式会破坏包装,继承会将父类的实现细节暴露给子类。
- 继承复用也叫白箱复用,组合聚合复用也叫黑箱复用。
场景示例
这里以数据访问层获取数据库连接为例,ProductDao 无需继承 DBConnection
java
public abstract class DBConnection {
public abstract String getConnection();
}
java
public class MySQLConnection extends DBConnection {
@Override
public String getConnection() {
return "MySQL 数据库连接";
}
}
public class OracleConnection extends DBConnection {
@Override
public String getConnection() {
return "Oracle 数据库连接";
}
}
java
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 + "增加产品");
}
}
java
public class ConnectionTest {
public static void main(String[] args) {
ProductDao productDao = new ProductDao();
// 使用时再去决定具体调哪个连接
productDao.setDbConnection(new MySQLConnection());
productDao.addProduct();
}
}
main 方法的输出结果如下:
使用MySQL数据库连接添加用户
合成复用原则的优点
- 提高系统的灵活性
- 降低类与类之间的耦合
- 一个类的变化对其他类造成的影响相对较少