天天看點

設計模式之8 - 組合Composite

        組合模式Composite 也稱為 整體-部分 模式,使用者可以通過一緻的方式 整體調用。

        組合模式特點可以概括為兩點:

1. 複雜對象對于簡單對象的組合;

2. 統一的對象接口,友善抽象的整體調用;

       對于第一點,從學習面向對象開始,組合模式 就表達了最基本的封裝的概念,這個意義上組合模式太簡單,簡單到和人要吃飯睡覺一樣,或者說其本身并不算一種模式。

       第二點抽象,單獨來看也就是繼承,是面向對象的一個基本概念,比如 抽象類 Graphics(可能分為 點、線、圓、矩形等等),包含統一的接口(比如繪制、平移、旋轉等)。

        組合模式 的價值(或者核心)就在于将這兩點進行統一,對于上面的例子就是 定義一種複雜圖形(就是組合對象),包含多個子對象(比如 同心圓 由兩個圓組合而成),将組合對象和簡單對象進行一緻處理。

        來看組合模式的類結構圖:        

設計模式之8 - 組合Composite
// 抽象的部件類描述将來所有部件共有的行為
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);
 }
           

繼續閱讀