[设计模式] 设计模式课程(十七)--组合模式
概述
- 数据结构模式
- 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用
- 将这些特定数据模式封装在内部,对外提供统一的接口,来实现与特定数据结构无关的访问
- 典型模式:Composite, Iterator, Chain of Resposibility
- 属于结构模式(按目的划分)
- 动机:软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端
- 如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?
- 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)
- 采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化成“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器
- 将“客户代码与复杂的对象容器结构”结构是Composite的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的内部实现结构——发生依赖,从而更能“应对变化”
- Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率
示例
- 34-36:多态调用,将内部数据结构封装
#include <iostream> #include <list> #include <string> #include <algorithm> using namespace std; class Component { public: virtual void process() = 0; virtual ~Component(){} }; //树节点 class Composite : public Component{ string name; list<Component*> elements; public: Composite(const string & s) : name(s) {} void add(Component* element) { elements.push_back(element); } void remove(Component* element){ elements.remove(element); } void process(){ //1. process current node //2. process leaf nodes for (auto &e : elements) e->process(); //多态调用 } }; //叶子节点 class Leaf : public Component{ string name; public: Leaf(string s) : name(s) {} void process(){ //process current node } }; void Invoke(Component & c){ //... c.process(); //... } int main() { Composite root("root"); Composite treeNode1("treeNode1"); Composite treeNode2("treeNode2"); Composite treeNode3("treeNode3"); Composite treeNode4("treeNode4"); Leaf leat1("left1"); Leaf leat2("left2"); root.add(&treeNode1); treeNode1.add(&treeNode2); treeNode2.add(&leaf1); root.add(&treeNode3); treeNode3.add(&treeNode4); treeNode4.add(&leaf2); process(root); process(leaf2); process(treeNode3); }
总结
相关推荐
妖怪哪里跑 2020-05-02
galoisgodel 2011-12-19
YGnice 2015-11-16
EdwardWong 2011-10-10
Element张冰 2019-06-26
WisdomXLH 2019-06-25
MarkArch 2019-06-21
一只刚刚上路的猿 2013-05-23
PythonBiglove 2016-02-02
githubphpnobug 2019-04-17
wlpython 2019-01-11
quadraticelement 2016-05-18
嵌入式企鹅圈 2011-12-28
vczh的日常 2018-04-05
vczh的日常 2018-03-29
前端外刊评论 2017-12-15