C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility
"数据结构"模式
常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。
典型模式
#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的更多相关文章
- 23种设计模式 - 数据结构(Composite - iterator - Chain of Responsibility)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 数据结构 Composite 动机(Motivation) 软件在某些情况下,客户代码过多依赖于对象容器复 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- C#设计模式:迭代器模式(Iterator Pattern)
一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...
- [设计模式] 8 组合模式 Composite
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- 设计模式 笔记 组合模式 Composite
//---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...
- 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器
上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...
- python 设计模式之组合模式Composite Pattern
#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...
随机推荐
- SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)
SQL Fundamentals || Oracle SQL语言 Capabilities of the SELECT Statement(SELECT语句的功能) Data retrieval fr ...
- mysql八:视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- nautilus
在~/.bashrc中定义命令别名,添加以下命令: # some more nautilus aliases alias here='nautilus . > /dev/null 2>&a ...
- POJ3468 a simple problem with integers 分块
题解:分块 解题报告: 是个板子题呢qwq 没什么可说的,加深了对分块的理解趴还是 毕竟这么简单的板子题我居然死去活来WA了半天才调出来,,,哭了QAQ 还是说下我错在了哪几个地方(...是的,有好几 ...
- Charles maplocal 时中文显示乱码问题
用Charles对request进行Map Local后,app上看返回的中文是乱码? 是Map Local的文件编码有问题?是Charles设置有问题?是电脑环境有问题?哈哈,都不是 你是Andro ...
- 正则验证ip
用python爬获取这样一条数据: <td class="ip" id="ip"><p style="display: none;& ...
- 【Echarts】图表用echarts【待完善】
echarts是做数据统计. ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox ...
- vscode主题配色
https://www.cnblogs.com/garvenc/p/vscode_customize_color_theme.html
- MySql操作语句集锦
Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意 ...
- 【剑指offer】旋转数组的最小数字
一.题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...