組合模式Composite 也稱為 整體-部分 模式,使用者可以通過一緻的方式 整體調用。
組合模式特點可以概括為兩點:
1. 複雜對象對于簡單對象的組合;
2. 統一的對象接口,友善抽象的整體調用;
對于第一點,從學習面向對象開始,組合模式 就表達了最基本的封裝的概念,這個意義上組合模式太簡單,簡單到和人要吃飯睡覺一樣,或者說其本身并不算一種模式。
第二點抽象,單獨來看也就是繼承,是面向對象的一個基本概念,比如 抽象類 Graphics(可能分為 點、線、圓、矩形等等),包含統一的接口(比如繪制、平移、旋轉等)。
組合模式 的價值(或者核心)就在于将這兩點進行統一,對于上面的例子就是 定義一種複雜圖形(就是組合對象),包含多個子對象(比如 同心圓 由兩個圓組合而成),将組合對象和簡單對象進行一緻處理。
來看組合模式的類結構圖:
// 抽象的部件類描述将來所有部件共有的行為
class Component
{
public:
// 添加部件
virtual void Add(Component component);
// 删除部件
virtual void Remove(Component component);
std::string m_strName;
};
// 組合部件類
class Leaf : public Component
{
// 葉子節點不具備添加的能力,不實作
virtual void Add(Component component)
{
}
// 葉子節點不具備添加的能力必然也不能删除
virtual void Remove(Component component)
{
}
};
// 組合類
class Composite : public Component
{
public:
// 添加節點 添加部件
virtual void Add(Component component)
{
m_vecComponent.push_back(component);
}
// 删除節點 删除部件
virtual void Remove(Component component)
{
// erase
}
protected:
//用來儲存組合的部件
vector<Component> m_vecComponent;
};
void main(char* args)
{
// 構造根節點
Composite root;
root.m_strName = "根節點";
// 添加子節點leaf
Leaf l_1;
l_1.m_strName = "葉節點一";
Leaf l_2;
l_2.m_strName = "葉節點二";
root.Add(l_1);
root.Add(l_2);
}