c++设计模式概述之组合(composite)
代码写的不够规范,目的是为了缩短代码篇幅, 实际中请不要这样做
1、概述
这里的组合,是将 部分组合到整体。所以, 用到的对象有: 部分、整体。 这里的例子,生活中可以类比厨房的筷筒: 里面放了筷子,勺子。 筷子 勺子就是部分, 整体就是块筒。再比如,冰箱 和放入冰箱的食材, 冰箱就是整体, 放入冰箱的食材就是部分。
对用户而言,对整体操作而不用关心操作的是具体哪一个对象。这就需要 部分与整体需要拥有对外相同接口。
2、代码示例
下面演示的是水果与果盘的关系。水果准备了 草莓 和 苹果。 这里的水果就是部分,果盘就是整体。
A、对外的接口类:
class melement { public: virtual void eat() = 0; };
B、苹果类,继承自上面的对外接口类
// apple class apple : public melement { public: void eat() { cout << "\n\n I am eating apple\n\n"; } };
C、草莓类,继承自上面的对外接口类
// strawberry class strawberry : public melement { public: void eat() { cout << "\n\n I am eating strawberry\n\n"; } };
D、果盘类,当然,也需要继承上面的对外接口类,果盘,可以添加和减少水果,额外增加了2个接口
// plate to contain fruits class plate : public melement { public: // add a fruit into the plate void increase(melement *pele) { if (pele) _list_fruits.push_back(pele); } // away from plate void decrease(melement* pele) { if (pele) _list_fruits.remove(pele); } // show the current fruits void eat() { for each (auto ele in _list_fruits) { if (ele) ele->eat(); } } private: list<melement *> _list_fruits; };
3、调用
这里,向果盘中添加了4个水果,再吃掉一个。
void call_mode_composite() { const int count_fruits_4 = 4; std::unique_ptr<melement> arr_fruits[count_fruits_4]; std::unique_ptr<plate> pplate(new(std::nothrow) plate); if (!pplate ) { cout << "\n\n created plate failed \n\n"; return; } // ------------------------------------------------------------------------------- for (int i = 0; i < count_fruits_4; i++) { melement *pp = nullptr; if (i < 2) arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) apple); else arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) strawberry); pplate->increase(arr_fruits[i].get()); } cout << "before decrease:\n"; pplate->eat(); cout << "\n\n after decreasing, eat:\n"; pplate->decrease(arr_fruits[0].get()); pplate->eat(); }
输出结果: