将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
#include "stdafx.h"
#include <string>
#include <map>
#include <iostream>
using namespace std;
class Component
{
public:
virtual void Add(Component* item)
{
}
virtual void Remove(Component* item)
{
}
virtual string GetName()
{
return string();
}
virtual void Operation() = 0;
};
class Composite : public Component
{
public:
Composite(string name) : m_name(name)
{
}
public:
virtual void Add(Component* item)
{
m_itemMap.insert(make_pair(item->GetName(), item));
}
virtual void Remove(Component* item)
{
m_itemMap.erase(item->GetName());
}
virtual string GetName()
{
return m_name;
}
virtual void Operation()
{
//可以做一些你想要的处理等
for (auto it = m_itemMap.begin(); it != m_itemMap.end(); ++it)
{
it->second->Operation();
}
}
private:
string m_name;
map<string, Component*> m_itemMap; //放子节点的容器,达到树形结构
};
//叶子节点
class Leaf : public Component
{
public:
Leaf(string name) : m_name(name)
{
}
public:
virtual string GetName()
{
return m_name;
}
virtual void Operation()
{
cout<<"this is "<<m_name<<"object"<<endl;
}
private:
string m_name;
};
int _tmain(int argc, _TCHAR* argv[])
{
Component* component1= new Composite("component1");
Component* component2= new Composite("component2");
Component* leaf1 = new Leaf("leaf1");
Component* leaf2 = new Leaf("leaf2");
Component* leaf3 = new Leaf("leaf3");
component1->Add(leaf1);
component1->Add(component2);
component2->Add(leaf2);
component2->Add(leaf3);
component1->Operation();
system("pause");
return 0;
}