组合模式:将对象组合成树形结构以表示部分和整体的关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。优点:基本对象可以组合成更复杂的对象。任何用到基本对象的地方,都可以使用组合对象。示例代码:
#include <string>
using std::string;
#include <list>
using std::list;
class CTest
{
public:
CTest(string name) :m_name(name){ }
virtual ~CTest(){ }
virtual void add(CTest* CTest){ }
virtual void remove(CTest* CTest){ }
virtual void display(int depth){ }
virtual void lineofduty(){ }
protected:
string m_name;
private:
};
class ConcreteTest :public CTest
{
public:
ConcreteTest(string name) :CTest(name){ }
~ConcreteTest()
{
while (true){
if (!m_childrenList.empty()){
delete *m_childrenList.begin();
}
else{
break;
}
}
}
void add(CTest* CTest)override
{
m_childrenList.push_back(CTest);
}
void remove(CTest* CTest)override
{
m_childrenList.remove(CTest);
}
void display(int depth)override
{
printf("%d,%s\n", depth, m_name.c_str());
for each (CTest* var in m_childrenList){
var->display(depth + 2);
}
}
void lineofduty()override
{
for each (CTest* var in m_childrenList){
var->lineofduty();
}
}
private:
list<CTest*>m_childrenList;
};
class LeafTest :public CTest
{
public:
LeafTest(string name) :CTest(name){ }
void add(CTest* CTest)override{ }
void remove(CTest* CTest){ }
void display(int depth)override
{
printf("%d,%s\n", depth, m_name.c_str());
}
void lineofduty()
{
printf("组合树的叶子\n");
}
};
int main()
{
ConcreteTest *root = new ConcreteTest("跟节点");
root->add(new LeafTest("叶子一"));
ConcreteTest* test1 = new ConcreteTest("子节点一");
test1->add(new LeafTest("子叶子一"));
root->add(test1);
ConcreteTest* test2 = new ConcreteTest("孙节点一");
test2->add(new LeafTest("孙叶子一"));
test1->add(test2);
printf("树的结构是-----------------\n");
root->display(1);
return 0;
}