组合模式
1.何为组合模式
组合模式将对象组合成树形结构来表示“部分–整体”层次接口。它为单个对象和容器对象提供相同的接口,使得用户对于单个对象和对象集合的使用具有一致性(稳定)
2.组合模式的意义和使用场景
将用户代码和复杂的容器结构解耦是组合模式的核心思想。解耦之后用户代码纯粹与抽象接口产生依赖,而非与容器内部的实现结构产生依赖,以此来应对变化。
3.组合模式的实现
由抽象基类继承出父节点类和子节点类,在重写父节点的方法时,遍历子节点去调用子节点的相应方法。以此,用户代码就只需要调用父节点的方法,就可以实现对子节点方法的调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Component { public: virtual void operation() = 0; virtual void add(Component* component) {} virtual void remove(Component* component) {} virtual Component* getChild(int index) { return nullptr; } };
class Leaf : public Component { public: void operation() override { std::cout << "Leaf operation" << std::endl; } };
class Composite : public Component { private: std::list<Component*> children;
public: void operation() override { std::cout << "Composite operation" << std::endl; for (auto component : children) { component->operation(); } } void add(Component* component) override { children.push_back(component); } void remove(Component* component) override { children.remove(component); } Component* getChild(int index) override { } };
int main() { Component* root = new Composite(); Component* leaf1 = new Leaf(); Component* leaf2 = new Leaf(); Component* leaf3 = new Leaf(); root->add(leaf1); Component* subComposite = new Composite(); subComposite->add(leaf2); subComposite->add(leaf3); root->add(subComposite); root->operation(); return 0; }
|