組合模式之商品管理
阿新 • • 發佈:2020-11-28
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 心得體會
概念:將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。
自己的理解:當要處理的物件之間是部分和整體的關係(整體功能點大於等於部分功能點),且使用者希望能忽略部分物件和整體物件的不同,統一的使用它們(有共同的介面)可以將這些物件組合成樹結構,葉節點是功能最少的類,由多個葉節點組成的樹節點有更多的功能。
好處:使用者可以一致的使用部分和組合物件,減少重複程式碼量。