Composite.h #pragma once #include <list> using namespace std; /** @brief 组合中的抽象基类 */ class Component { public: Component(void); virtual ~Component(void); /** * @brief 纯虚函数,只提供接口 */ virtual void Operation() = 0; // 虚函数,提供接口并提供默认实现 virtual void Add(Component* pChild); virtual void Remove(Component* pChild); virtual Component* GetChild(int nIndex); }; // 派生自Component,是其中的叶子组件的基类 class Leaf : public Component { public: Leaf(){} virtual ~Leaf(){} virtual void Operation(); }; // 派生自Component,是其中的含有子件的组件的基类 class Composite : public Component { public: Composite(void); virtual ~Composite(void); virtual void Operation(); // 虚函数,提供接口并提供默认实现 virtual void Add(Component* pChild); virtual void Remove(Component* pChild); virtual Component* GetChild(int nIndex); private: list<Component*> m_listpComponent; }; Composite.cpp #include "StdAfx.h" #include "Composite.h" #include <iostream> #include <algorithm> #include <functional> #include <assert.h> using namespace std; Component::Component(void) { } Component::~Component(void) { } void Component::Add(Component* pChild) { } void Component::Remove(Component* pChild) { } Component* Component::GetChild(int nIndex) { return NULL; } void Leaf::Operation() { cout << "Operation by leaf" << endl; } Composite::Composite(void) { } Composite::~Composite(void) { list<Component*>::iterator itr = m_listpComponent.begin(); for(;itr != m_listpComponent.end(); ++itr) { delete *itr; } m_listpComponent.clear(); } void Composite::Operation() { for_each(m_listpComponent.begin(),m_listpComponent.end(),mem_fun(&Component::Operation)); } void Composite::Add(Component* pChild) { m_listpComponent.push_back(pChild); } void Composite::Remove(Component* pChild) { list<Component*>::iterator itr = find(m_listpComponent.begin(),m_listpComponent.end(),pChild); if(itr != m_listpComponent.end()) m_listpComponent.erase(itr); } Component* Composite::GetChild(int nIndex) { assert(nIndex >= 0 && nIndex < (int)m_listpComponent.size()); list<Component*>::iterator itr = m_listpComponent.begin(); list<Component*>::iterator itrEnd = m_listpComponent.end(); int i = 0; for( ; itr != itrEnd ; ++itr,++i) { if(i == nIndex) break; } return *itr; } Main()函数 #include "stdafx.h" #include "Composite.h" #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; /** * @brief Composite模式将对象组合成树型结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。 */ int _tmain(int argc, _TCHAR* argv[]) { Component* pLeaf1 = new Leaf(); Component* pLeaf2 = new Leaf(); Component* pComposite1 = new Composite(); shared_ptr<Component> pComposite2(new Composite()); cout << "pLeaf1" << endl; pLeaf1->Add(pLeaf2); // 此步骤不做任何操作 pLeaf1->Operation(); cout << "pComposite1" << endl; pComposite1->Add(pLeaf1); pComposite1->Add(pLeaf2); pComposite1->Operation(); cout << "pComposite1 remove" << endl; pComposite1->Remove(pComposite1->GetChild(0)); pComposite1->Operation(); cout << "pComposite2" << endl; pComposite2->Add(pLeaf1); pComposite2->Add(pComposite1); pComposite2->Operation(); system("pause"); return 0; }