合成/聚合复用原则(CARP):
优先使用合成/聚合,而不是使用类继承。
聚合表示一种弱的”拥有关系”,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。
合成表示一种强的”拥有关系”,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
其好处:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物,而继承就有可能。
继承是一种强耦合的结构,父类变,子类就要变。使用继承时,一定要在是‘is-a’的关系时再考虑使用,而不是任何时候都去使用。
桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
实现指的是抽象类和它的派生类用来实现自己的对象。
测试用例:
int main(){
ConerectImplementorA *A = new ConerectImplementorA;
ConerectImplementorB *B = new ConerectImplementorB;
Abstraction *abs = new Abstraction;
abs->setImplementor(A);
abs->Operation(); //Output: ConerectImplementorA.
Abstraction *abs2 = new Abstraction;
abs2->setImplementor(B);
abs2->Operation(); //Output: ConerectImplementorB.
return 0;
}
模式实现
//Implementor类,实现类
class Implementor{
public:
virtual void Operator(){
}
};
//具体实现类A
class ConerectImplementorA: public Implementor{
virtual void Operator(){
std::cout << "ConerectImplementorA.\n";
}
};
//具体实现类B
class ConerectImplementorB: public Implementor{
virtual void Operator(){
std::cout << "ConerectImplementorB.\n";
}
};
//抽象类->桥接Implementor类
class Abstraction{
protected:
Implementor *imp;
public:
void setImplementor(Implementor *imp){
this->imp = imp;
}
virtual void Operation(){
imp->Operator();
}
};
//被提炼的对象
class RefinedAbstraction: public Abstraction{
virtual void Operation()override{
imp->Operator();
}
};
总结:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合。