合成复用原则(Composite Reuse Principle,CRP)
原创大约 2 分钟
合成复用原则(Composite Reuse Principle,CRP)的中心思想就是一句话:组合优于继承
。
因为使用组合
或聚合
关系,可以最大限度地解耦
,而如果使用继承
,那么当父类发生变化的时候,所有的子类可能都要变。
例如,有如下的UserDao
数据持久类,它继承自DBConnection
类。
package com.itechthink.designrule.composite;
/**
* 数据库连接
*
*/
public class DBConnection {
public String getConnection() {
return "获取MySQL数据库连接";
}
}
public class UserDao extends DBConnection {
public void add() {
String conn = getConnection();
System.out.println("使用数据库连接");
// TODO ......
}
}
如果需要支持的数据库不断增加,例如还需要连接Oracle、PostgreSQL等,那么是不是就得增加OracleUserDao
和PgSQLUserDao
呢?
这样做显然不合适,大大增加了持久化
逻辑中的耦合
关系。
所以按照合成复用原则(Composite Reuse Principle,CRP)的思想,用组合
代替继承
。
package com.itechthink.designrule.composite;
/**
* 数据库连接
*
*/
public interface DBConnection {
public String getConnection();
}
/**
* MySQL数据库连接
*
*/
public class MySQLConnection implements DBConnection {
public String getConnection() {
return "获取MySQL数据库连接";
}
}
/**
* Oracle数据库连接
*
*/
public class OracleConnection implements DBConnection {
public String getConnection() {
return "获取Oracle数据库连接";
}
}
/**
* PgSQL数据库连接
*
*/
public class PgSQLConnection implements DBConnection {
public String getConnection() {
return "获取PostgreSQL数据库连接";
}
}
然后再以组合
/聚合
(或者依赖注入
)的方式,让UserDao
来调用数据库连接类。
package com.itechthink.designrule.composite;
/**
* 合成复用原则是指尽量使用对象的组合/聚合,而不是使用继承达到软件复用的目的,最典型的就是Spring的依赖注入
*
*/
public class UserDao {
@Autowared
private MySQLConnection connection;
public UserDao(MySQLConnection connection) {
this.connection = connection;
}
public void add() {
String conn = connection.getConnection();
System.out.println("使用MySQL数据库连接");
}
}
这样一来,负责持久化
和负责连接
的两个类各司其职,耦合度大大降低。
感谢支持
更多内容,请移步《超级个体》。