合成复合原则要求我们在软件设计中尽量使用对象组合和聚合而不是集成关系达到软件复用的目的,这样可以使系统更加灵活,降低类与类的耦合度。
典型案例在软件开发过程中,我们常常会使用到数据库,接下来我们就以数据库连接做一下简单的示例
首先,我们新建一个数据库连接类DBConnection
public class DBConnection {
public String getConnection() {
return "MySql数据库连接";
}
}
然后我们新建一个产品DAO,里面由设置数据库连接以及新增产品的功能
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+"增加产品");
}
}
然后我们在Test里测试一下
public static void main(String[] args) {
DBConnection dbConnection = new DBConnection();
ProductDao productDao = new ProductDao();
productDao.setDbConnection(dbConnection);
productDao.addProduct();
}
这就是一种非常典型的合成复用原则的应用 场景。
但是这个设计还是有点问题,当我们使用的数据库不是MySql,而是又新增了Oracle数据库, 此时就不好进行扩展了。此时我们可以将数据库连接的类抽象出来,然后每种数据库连接都实现这个连接类接口就可以了
DBConnection:
public abstract class DBConnection {
public abstract String getConnection();
}
MySqlDBConnection:
public class MySqlDBConnection extends DBConnection{
@Override
public String getConnection() {
return "MySql数据库连接";
}
}
OracleDBConnection:
public class OracleDBConnection extends DBConnection {
@Override
public String getConnection() {
return "Oracle数据库连接";
}
}
Dao层不用更改,我们只要在实际使用的时候确定是使用哪种数据库就可以了
Test :
public class Test {
public static void main(String[] args) {
DBConnection dbConnection = new OracleDBConnection();
ProductDao productDao = new ProductDao();
productDao.setDbConnection(dbConnection);
productDao.addProduct();
}
}
然后测试我们会获得相应的结果



