合成/聚合复用原则(Composition/Aggregation Principle,CARP)也叫做合成复用原则(Composition Reuse Principle,CRP),它指在一个新的对象中引入/注入现有的对象以达到功能复用和扩展的目的。复用有两种方式,一种是组合/聚合复用(也有称黑箱复用),一种是通过继承实现复用(也称白箱复用),而合成/聚合复用原则就是说只要允许,尽量使用对象组合(has-a)/聚合(contains-a)而不是使用继承(is-a)来实现复用。
代码示例
以一个Spring项目中整合MyBatis为例,DAO的基础类使用合成/聚合方式使用SqlSessionFactory,而不是直接继承SqlSessionFactory(的实现)
// 整合MyBatis的基础抽象DAO伪类码
// BaseDao内部使用SqlSessionFactory(has-a/contains-a),而不是去继承它(的实现类,is-a)
public abstract class BaseDao {
// 一般情况下,它应是一个单例,这里仅作演示
private SqlSessionFactory sqlSessionFactory;
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public SqlSession getSqlSession() {
return this.sqlSessionFactory.openSession();
}
}
总结
合成和聚合是类和类的一种关联关系。它表示一个类中拥有或包含另外一个类型,而不是就是某个类型(子类)。