组合模式
来源:互联网 发布:色内内电影网新域名 编辑:程序博客网 时间:2024/06/06 01:59
1.动机
(1)在软件在某些情况下,客户代码过多依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性,扩展性等弊端
(2)如何“将客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自己的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?
2.模式定义
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。
-------《设计模式》GoF
3.结构(Structure)
4.要点总结
(1)Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一直地(复用)处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。
(2)将“客户代码与复杂的对象容器结构”解耦是Composite的核心思想,解耦之后,客户代码将与纯粹的抽象接口-----而非对象容器的内部实现结构-----发生依赖,从而更能“应对变化”
(3)Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。
5.示例代码
#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); }
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 转--FPGA全局时钟系统的设计
- 前端框架沉思录(上)
- bzoj1014 神奇的平衡树+hash
- js将毫秒时间转换成日期型时间
- 深度神经网络及TensorFlow实现1-激活函数(Activation Function)2
- 组合模式
- hdu_6016
- codeup 1906 特殊乘法
- AddBinary
- 关于除法的细节问题。。。蛋疼。。
- 第一个网站搭建过程额(2)
- python练习(十二)
- H
- 20170812_继承与多态测试实例