1. 程式人生 > 實用技巧 >組合模式之商品管理

組合模式之商品管理

4、組合模式

4.1 作業題目

用組合模式對購物網站的商品進管理,繪製選擇模式的結構圖,並繪製該案例的類圖,並編寫程式碼演示結果,執行結果樣例顯示如下圖所示。

4.2 所用模式結構檢視

4.3 本例項類圖

4.4 例項實現程式碼

//結點基類

class HJL20189350109goods
{
public:
    string name;
    HJL20189350109goods() = default;
    HJL20189350109goods(string n) : name(n) { }

    virtual void add(HJL20189350109goods* g){}
    virtual void remove(HJL20189350109goods* g){}
    virtual void display(int depth){}
};

//葉節點類

class HJL20189350109concreteGoods : public HJL20189350109goods
{
public:
    HJL20189350109concreteGoods() = default;
    HJL20189350109concreteGoods(string n) : HJL20189350109goods(n) {}

    void add(HJL20189350109goods* g) override
    {
        cout << "Cannot add\n";
    }

    void remove(HJL20189350109goods* g) override
    {
        cout << "Cannot remove\n";
    }

    void display(int depth) override
    {
        cout << string(depth, ' ') << "-" << name << '\n';
    }
};

//有枝結點類

class HJL20189350109categories : public HJL20189350109goods
{
public:
    HJL20189350109categories() = default;
    HJL20189350109categories(string n) : HJL20189350109goods(n) {}
    list<HJL20189350109goods*> children;

    void add(HJL20189350109goods* g) override
    {
        children.push_back(g);
    }

    void remove(HJL20189350109goods* g) override
    {
        children.remove(g);
    }

    void display(int depth) override
    {
        cout << string(depth, ' ') << "+" << name << '\n';
        for (auto i : children)
        {
            i->display(depth + 2);
        }
    }
};

//客戶端程式

int main()
{
    HJL20189350109categories root("服裝");

    HJL20189350109categories mWear("男裝");
    HJL20189350109categories wWear("女裝");

    root.add(&mWear);
    root.add(&wWear);

    mWear.add(new HJL20189350109concreteGoods("襯衣"));
    mWear.add(new HJL20189350109concreteGoods("夾克"));

    wWear.add(new HJL20189350109concreteGoods("裙子"));
    wWear.add(new HJL20189350109concreteGoods("套裝"));

    root.display(1);
}

4.5 執行結果

4.6 心得體會

概念:將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

自己的理解:當要處理的物件之間是部分和整體的關係(整體功能點大於等於部分功能點),且使用者希望能忽略部分物件和整體物件的不同,統一的使用它們(有共同的介面)可以將這些物件組合成樹結構,葉節點是功能最少的類,由多個葉節點組成的樹節點有更多的功能。

好處:使用者可以一致的使用部分和組合物件,減少重複程式碼量。