設計模式--結構型模式--組合模式
//Structural Patterns--Composite
//結構型模式--組合模式
//Component(抽象構件):為葉子構件和容器構件物件定義介面,可以包含所有子類共有行為的宣告和實現。在抽象構件中,聲明瞭訪問及管理子構件的介面(例如:Add()、Remove()、GetChild() 等)。
//Leaf(葉子構件):葉子節點沒有子節點。它實現了 Component 中定義的行為,對於訪問及管理子構件的介面,可以通過異常等方式進行處理。
//Composite(容器構件):容器節點包含子節點(可以是葉子構件,也可以是容器構件)。它提供了一個集合用於儲存子節點,實現了 Component 中定義的行為,包括訪問及管理子構件的介面,
//在其業務方法中可以遞迴呼叫其子節點的業務方法。
//-----------------------------------------------------------
//Component(抽象構件)
class Component
{
public:
Component(string name){m_strName = name;}
virtual ~Component(){}
#if __DEFTM//透明組合模式
virtual void Add(Component *comp) = 0;
virtual void Remove(Component *comp1) = 0;
virtual Component* GetChild(int index) = 0;
#endif
virtual void Operation(int indent) = 0;
private:
Component();
protected:
string m_strName;
};
//-----------------------------------------------------------
//Leaf(葉子構件)
class Leaf : public Component
{
public:
Leaf(string name):Component(name){}
virtual ~Leaf(){}
#if __DEFTM//透明組合模式
virtual void Add(Component *comp){cout << "Can`t add to a leaf."<<endl;}
virtual void Remove(Component *comp1){cout << "Can`t remove from a leaf." << endl;}
virtual Component* GetChild(int index){cout <<"Can`t get child from a leaf." << endl;return NULL;}
#endif
virtual void Operation(int indent){string newStr(indent , '-');cout << newStr << " " << m_strName << endl;}
private:
Leaf();
};
//-----------------------------------------------------------
//Composite(容器構件)
class Composite : public Component
{
public:
Composite(string name):Component(name){}
virtual ~Composite()
{
while(!m_elements.empty())
{
std::vector<Component*>::iterator it = m_elements.begin();
if(*it != NULL) {delete *it ; *it = NULL;}
m_elements.erase(it);
}
}
virtual void Add(Component *comp)
{
m_elements.push_back(comp);
}
virtual void Remove(Component *comp)
{
std::vector<Component*>::iterator it = m_elements.begin();
while(it != m_elements.end())
{
if(*it == comp)
{
m_elements.erase(it);
if(comp != NULL) {delete comp ; comp = NULL;}
break;
}
it++;
}
}
virtual Component* GetChild(int index)
{
if(index >= m_elements.size()) return NULL;
return m_elements[index];
}
virtual void Operation(int indent)
{
string newStr(indent , '-');
cout << newStr << "+ " << m_strName << endl;
std::vector<Component*>::iterator it = m_elements.begin();
while(it != m_elements.end())
{
(*it)->Operation(indent+2);
++it;
}
}
private:
Composite();
std::vector<Component *> m_elements;
};
//-----------------------------------------------------------
//測試
void dpCompositeTestMain()
{
#if __DEFTM//透明組合模式
Component *pRoot = new Composite("江湖公司(任我行)");
#else//安全組合模式
Composite *pRoot = new Composite("江湖公司(任我行)");
#endif
//部門一
#if __DEFTM//透明組合模式
Component *pDepart1 = new Composite("日月神教(東方不敗)");
#else//安全組合模式
Composite *pDepart1 = new Composite("日月神教(東方不敗)");
#endif
pDepart1->Add(new Leaf("光明左使(向問天)"));
pDepart1->Add(new Leaf("光明右使(曲洋)"));
pRoot->Add(pDepart1);
//部門二
#if __DEFTM//透明組合模式
Component *pDepart2 = new Composite("五嶽劍派(左冷蟬)");
#else//安全組合模式
Composite *pDepart2 = new Composite("五嶽劍派(左冷蟬)");
#endif
pDepart2->Add(new Leaf("嵩山(左冷蟬)"));
pDepart2->Add(new Leaf("衡山(莫大)"));
pDepart2->Add(new Leaf("華山(嶽不群)"));
pDepart2->Add(new Leaf("泰山(天門道長)"));
pDepart2->Add(new Leaf("恆山(定閒師太)"));
pRoot->Add(pDepart2);
pRoot->Add(new Leaf("少林(方證大師)"));
pRoot->Add(new Leaf("武當(沖虛道長)"));
Component *pLeaf = new Leaf("青城(餘滄海)");
pRoot->Add(pLeaf);
pRoot->Remove(pLeaf);
pRoot->Operation(1);
if(pRoot != NULL){delete pRoot; pRoot = NULL;}
return;
}