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
#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...
随机推荐
- POJ 2398 - Toy Storage - [计算几何基础题][同POJ2318]
题目链接:http://poj.org/problem?id=2398 Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad ...
- SCRAM
RFC 5802 - Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms ht ...
- Prime Path--POJ3126(bfs)
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
- swiper跳转制定页面
haha(){ var that=this; that.$refs.mySwiper.swiper.slideTo(1, 1000, false); } //以上代码是 获取ref值为myswipe ...
- 聊一聊Linux中的工作队列
2018-01-18 工作队列是Linux内核中把工作延迟执行的一种手段,其目的不同于软中断,软中断是提高CPU的响应,尽可能的缩短关中断的时间:而工作队列主要目的是节省资源,其比较适合很微小的任务, ...
- TcMalloc的介绍以及Windows下安装使用
本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/Introduction_TcMalloc.html 介绍: TcMalloc(Threa ...
- mysql python pymysql模块 增删改查 插入数据 介绍 commit() execute() executemany() 函数
import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' mysql_pwd = ' encoding = ...
- 006-jdk1.5版本新特性
一.Java SE 5.0 (1.5.0) 名称:Tiger(老虎) 发布日期:2004-09-30 新特性: 1.1.静态导入 定义:静态导入用于简化程序对类静态属性和方法的调用. 语法: impo ...
- [vue]实现父子组件数据双向绑定
参考: http://www.cnblogs.com/xxcanghai/p/6124699.html <!DOCTYPE html> <html lang="en&quo ...
- HDU5012:Dice(bfs模板)
http://acm.hdu.edu.cn/showproblem.php?pid=5012 Problem Description There are 2 special dices on the ...