组合模式(Composite Pattern)—— 将对象组合成树形结构以表示"部分-总体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具备一致性。ios
问题:在开发中,咱们常常可能要递归构建树状的组合结构,Composite 模式则提供了很好的解决方案。c++
主要解决:它在咱们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序能够向处理简单元素同样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。ui
什么时候使用:spa
如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。code
关键代码:树枝内部组合该接口,而且含有内部属性 List,里面放 Component。对象
使用场景:部分、总体场景,如树形菜单,文件、文件夹的管理。递归
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//接口抽象
class Component {
public:
Component(string name){
m_name=name;
}
virtual ~Component(){}
public:
virtual void Operation()=0;
virtual void Add(const Component& ){}
virtual void Remove(const Component& ){}
virtual Component* GetChild(int ){
return NULL;
}
string m_name;
};
class Composite:public Component
{
public:
Composite(string name):Component(name){}
~Composite(){
cout<<m_name<<" destructor..."<<endl;
for (vector<Component *>::iterator it = comVec.begin();it!=comVec.end();++it){
delete *it;
}
}
public:
void Operation(){
vector<Component*>::iterator comiter=comVec.begin();
for (; comiter!=comVec.end();comiter++)
{
(*comiter)->Operation();
}
}
void Add(Component* com){
comVec.push_back(com);
}
void Remove(Component* com){
for (vector<Component*>::iterator it = comVec.begin();it!=comVec.end();it++){
if (*it == com){
delete *it;
*it=NULL;
comVec.erase(it);
break;
}
}
}
Component* GetChild(int index){
return comVec[index];
}
private:
vector<Component*> comVec;
};
class Leaf:public Component
{
public:
Leaf(string name):Component(name){
}
~Leaf(){
cout<<m_name<<" destructor..."<<endl;
}
void Operation(){
cout<<"Leaf("<<m_name<<") operation......"<<endl;
}
};
int main() {
Composite* root = new Composite("root");
Leaf* la=new Leaf("leaf a");
Leaf* lb=new Leaf("leaf b");
Leaf* laa=new Leaf("leaf aa");
Composite* coma = new Composite("com a");
Composite* comb = new Composite("com b");
coma->Add(la);
coma->Add(lb);
comb->Add(laa);
root->Add(coma);
root->Add(comb);
// coma->Operation();
root->Operation();
// Component* l_a=coma->GetChild(0);
// l_a->Operation();
delete root;
return 0;
}
复制代码