"数据结构"模式
  常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。

  典型模式
  #Composite
  #Iterator
  #Chain of Resposibility

part 1 Composite 模式

  动机
  #软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、拓展性等弊端。
  #如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

  模式定义
  将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。——《设计模式》GoF

  结构

  结构 from 《大话设计模式》

  代码 from 《大话设计模式》

 #include <iostream>
#include <string>
#include <set> using namespace std; struct Company; using depth = unsigned;
using container = set<Company*>; struct Company {
virtual void display(depth d) = ;
virtual void lineDuty() = ;
}; //brunch nood
struct ConcreteCompany : public Company {
container childrens;
string _name; ConcreteCompany(string name) : _name(name) {}; virtual void display(depth d) override {
for (depth i = ; i < d; i++)
cout << "-"; cout << _name <<endl; for(auto e : this -> childrens)
e->display(d + );
} virtual void lineDuty() override {
for (auto e : childrens)
e->lineDuty();
} void add(Company* c) {
this -> childrens.insert(c);
} void remove(Company* c) {
this -> childrens.erase(c);
}
}; //leaf nood
struct FinanceDepartment : public Company {
string _name; FinanceDepartment(string name) : _name(name) {}; virtual void display(depth d) override {
for (depth i = ; i < d; i++)
cout << "-"; cout << _name << endl;
} virtual void lineDuty() override {
cout << _name << "财务部 公司收支管理" << endl;
}
}; //leaf nood
struct HRDepartment : public Company {
string _name; HRDepartment(string name) : _name(name) {}; virtual void display(depth d) override {
for (depth i = ; i < d; i++)
cout << "-"; cout << _name << endl;
} virtual void lineDuty() override {
cout << _name << "人力资源部 员工招聘培训管理" << endl;
}
}; int main() {
ConcreteCompany *root = new ConcreteCompany("北京总公司");
root->add(new HRDepartment("总公司人力资源部"));
root->add(new FinanceDepartment("总公司财务部")); ConcreteCompany *comp = new ConcreteCompany("上海华东分公司");
comp->add(new HRDepartment("华东分公司人力资源部"));
comp->add(new FinanceDepartment("华东分公司财务部"));
root->add(comp); ConcreteCompany *comp1 = new ConcreteCompany("南京办事处");
comp1->add(new HRDepartment("南京办事处人力资源部"));
comp1->add(new FinanceDepartment("南京办事处财务部"));
comp->add(comp1); ConcreteCompany *comp2 = new ConcreteCompany("杭州办事处");
comp2->add(new HRDepartment("杭州办事处人力资源部"));
comp2->add(new FinanceDepartment("杭州办事处财务部"));
comp->add(comp2); cout << "结构图" << endl;
root->display(); cout << "职责" << endl;
root->lineDuty(); return ;
}

  要点总结
  #Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
  #将“客户代码与复杂的对象容器结构”解耦的是Composite的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的内部实现结构——发生依赖,从而更能“应对变化”。
  #Composite模式在具体实现中,可以让父对象中的字对象反向追溯;如果父对象有频繁的遍历需求,可以使用缓存技巧来改善效率。

C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility的更多相关文章

  1. 23种设计模式 - 数据结构(Composite - iterator - Chain of Responsibility)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 数据结构 Composite 动机(Motivation) 软件在某些情况下,客户代码过多依赖于对象容器复 ...

  2. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  3. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  4. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  5. C#设计模式:迭代器模式(Iterator Pattern)

    一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...

  6. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  7. 设计模式 笔记 组合模式 Composite

    //---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...

  8. 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器

    上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...

  9. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

随机推荐

  1. SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)

    SQL Fundamentals || Oracle SQL语言 Capabilities of the SELECT Statement(SELECT语句的功能) Data retrieval fr ...

  2. mysql八:视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  3. nautilus

    在~/.bashrc中定义命令别名,添加以下命令: # some more nautilus aliases alias here='nautilus . > /dev/null 2>&a ...

  4. POJ3468 a simple problem with integers 分块

    题解:分块 解题报告: 是个板子题呢qwq 没什么可说的,加深了对分块的理解趴还是 毕竟这么简单的板子题我居然死去活来WA了半天才调出来,,,哭了QAQ 还是说下我错在了哪几个地方(...是的,有好几 ...

  5. Charles maplocal 时中文显示乱码问题

    用Charles对request进行Map Local后,app上看返回的中文是乱码? 是Map Local的文件编码有问题?是Charles设置有问题?是电脑环境有问题?哈哈,都不是 你是Andro ...

  6. 正则验证ip

    用python爬获取这样一条数据: <td class="ip" id="ip"><p style="display: none;& ...

  7. 【Echarts】图表用echarts【待完善】

    echarts是做数据统计. ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox ...

  8. vscode主题配色

    https://www.cnblogs.com/garvenc/p/vscode_customize_color_theme.html

  9. MySql操作语句集锦

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...

  10. 【剑指offer】旋转数组的最小数字

    一.题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...