[Head First设计模式]生活中学设计模式——组合模式
系列文章
[Head First设计模式]山西面馆中的设计模式——装饰者模式
[Head First设计模式]山西面馆中的设计模式——观察者模式
[Head First设计模式]山西面馆中的设计模式——建造者模式
[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
[Head First设计模式]一个人的平安夜——单例模式
[Head First设计模式]抢票中的设计模式——代理模式
[Head First设计模式]面向对象的3特征5原则
[Head First设计模式]鸭子模型——策略模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]餐馆中的设计模式——命令模式
[Head First设计模式]身边的设计模式——适配器模式
[Head First设计模式]生活中学设计模式——迭代器模式
引言
比如:复制文件,可以一个一个文件复制粘贴也可以整个文件夹进行复制粘贴。
组合模式
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
类图
角色
Component:为组合中的对象声明接口。
Leaf:在组合中表示没有子节点的叶节点。
Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
适用场景
希望把对象表示成整体-部分层次结构。
希望永固忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象。
优点
基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。
客户可以一致的使用组合结构和单个对象。这样用户就不必关心处理的是一个叶节点还是一个组合组件。这样就大大简化了客户代码。
新定义的Componnt或Leaf子类自动地与已有的结构和客户代码一起协同工作,客户程序不需要因新的Component类而改变。
缺点
直接使用了实现类,在面向抽象编程上是很不恰当的,与依赖倒置原则冲突。
一个例子
比如oa系统中最常见的组织结构关系:
1 namespace Wolfy.组合模式 2 { 3 /// <summary> 4 /// 抽象接口类 5 /// </summary> 6 public abstract class Company 7 { 8 public Company(string name) 9 { this.Name = name; } 10 public string Name { get; set; } 11 public abstract void Add(Company company); 12 public abstract void Remove(Company company); 13 public abstract void Display(int depth); 14 } 15 }
1 namespace Wolfy.组合模式 2 { 3 /// <summary> 4 /// 叶节点 子公司 部门类 5 /// </summary> 6 public class ConcreteCompany:Company 7 { 8 private List<Company> list= new List<Company>(); 9 public ConcreteCompany(string name) 10 : base(name) 11 { } 12 public override void Add(Company company) 13 { 14 list.Add(company); 15 } 16 17 public override void Remove(Company company) 18 { 19 list.Remove(company); 20 } 21 22 public override void Display(int depth) 23 { 24 StringBuilder sb = new StringBuilder(); 25 for (int i = 0; i < depth; i++) 26 { 27 sb.Append("-"); 28 } 29 Console.WriteLine(sb.ToString()+base.Name); 30 Console.WriteLine(); 31 foreach (Company item in list) 32 { 33 item.Display(depth + 2); 34 } 35 } 36 } 37 }
1 namespace Wolfy.组合模式 2 { 3 /// <summary> 4 /// 叶节点类 人事部 5 /// </summary> 6 public class HRDepartment:Company 7 { 8 public HRDepartment(string name) 9 : base(name) 10 { } 11 public override void Add(Company company) 12 { 13 throw new NotImplementedException(); 14 } 15 16 public override void Remove(Company company) 17 { 18 throw new NotImplementedException(); 19 } 20 21 public override void Display(int depth) 22 { 23 24 Console.WriteLine(new String('-', depth) + base.Name); 25 26 Console.WriteLine(); 27 } 28 } 29 }
1 namespace Wolfy.组合模式 2 { 3 /// <summary> 4 /// 叶节点 财务部 5 /// </summary> 6 public class FinanceDepartment:Company 7 { 8 public FinanceDepartment(string name) : base(name) { } 9 public override void Add(Company company) 10 { 11 throw new NotImplementedException(); 12 } 13 14 public override void Remove(Company company) 15 { 16 throw new NotImplementedException(); 17 } 18 19 public override void Display(int depth) 20 { 21 Console.WriteLine(new String('-', depth) + base.Name); 22 Console.WriteLine(); 23 } 24 } 25 }
1 namespace Wolfy.组合模式 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Company root = new ConcreteCompany("北京总公司"); 8 root.Add(new HRDepartment("总公司人力资源部")); 9 root.Add(new FinanceDepartment("总公司财务部")); 10 Company shandongCom = new ConcreteCompany("山东分公司"); 11 shandongCom.Add(new HRDepartment("山东分公司人力资源部")); 12 shandongCom.Add(new FinanceDepartment("山东分公司账务部")); 13 Company zaozhuangCom = new ConcreteCompany("枣庄办事处"); 14 zaozhuangCom.Add(new FinanceDepartment("枣庄办事处财务部")); 15 zaozhuangCom.Add(new HRDepartment("枣庄办事处人力资源部")); 16 Company jinanCom = new ConcreteCompany("济南办事处"); 17 jinanCom.Add(new FinanceDepartment("济南办事处财务部")); 18 jinanCom.Add(new HRDepartment("济南办事处人力资源部")); 19 shandongCom.Add(jinanCom); 20 shandongCom.Add(zaozhuangCom); 21 Company huadongCom = new ConcreteCompany("上海华东分公司"); 22 huadongCom.Add(new HRDepartment("上海华东分公司人力资源部")); 23 huadongCom.Add(new FinanceDepartment("上海华东分公司账务部")); 24 Company hangzhouCom = new ConcreteCompany("杭州办事处"); 25 hangzhouCom.Add(new FinanceDepartment("杭州办事处财务部")); 26 hangzhouCom.Add(new HRDepartment("杭州办事处人力资源部")); 27 Company nanjingCom = new ConcreteCompany("南京办事处"); 28 nanjingCom.Add(new FinanceDepartment("南京办事处财务部")); 29 nanjingCom.Add(new HRDepartment("南京办事处人力资源部")); 30 huadongCom.Add(hangzhouCom); 31 huadongCom.Add(nanjingCom); 32 root.Add(shandongCom); 33 root.Add(zaozhuangCom); 34 root.Add(jinanCom); 35 root.Add(huadongCom); 36 root.Add(hangzhouCom); 37 root.Add(nanjingCom); 38 root.Display(0); 39 Console.Read(); 40 } 41 } 42 }
结果:
总结
优点
基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。
客户可以一致的使用组合结构和单个对象。这样用户就不必关心处理的是一个叶节点还是一个组合组件。这样就大大简化了客户代码。
新定义的Componnt或Leaf子类自动地与已有的结构和客户代码一起协同工作,客户程序不需要因新的Component类而改变。
缺点
直接使用了实现类,在面向抽象编程上是很不恰当的,与依赖倒置原则冲突。
参考:
《Head First 设计模式》
百度百科
博客地址: | http://www.cnblogs.com/wolf-sun/ |
博客版权: |
本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。 转载:http://www.cnblogs.com/wolf-sun/p/3636768.html |
[Head First设计模式]生活中学设计模式——组合模式相关推荐
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
- 设计模式十二之组合模式
设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
- 设计模式的理解:组合模式 (Composite)
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- 设计模式08: Composite 组合模式(结构型模式)
Composite 组合模式(结构型模式) 对象容器的问题 在面向对象系统中,我们常会遇到一类具有"容器"特征的对象--即他们在充当对象的同时,又是其他对象的容器. public ...
- 大战设计模式【13】—— 组合模式
组合模式(Composite) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 组合多个对象形成树形结构以表 ...
- 设计模式笔记九:组合模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 组合模式(Composite Pattern) 又叫部分整体模式,是用于 ...
- 设计模式之禅【组合模式】
真刀实枪之组合模式 从公司的人事架构谈起吧 公司的组织架构 从上图中可以分析出: 有分支的节点(树枝节点) 无分支的节点(叶子节点) 根节点(无父节点) 有了树状结构图,再看看类图长啥样吧! 这个类图 ...
- 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)
目录 一.组合模式 1. 什么是组合模式 2. 组合模式案例 二.桥接模式 1. 什么是桥接模式 2. 桥接模式案例 一.组合模式 1. 什么是组合模式 Composite Pattern,组合模式, ...
最新文章
- 3Mysql 的常用操作
- 设计模式(访问者模式)
- linux中ctime,mtime,atime的区别
- 十种机制保护三大网络基础协议(BGP、NTP和FTP)—Vecloud微云
- 软工实践——团队作业需求规格说明书——原型UI设计
- 计算机及其配件和参数知识科普
- python数据变更邮件提醒_如何使python脚本在某些数据更改时自动发送电子邮件?...
- idea社区版下载lombok或是导入lombok.jar包
- 在Windows 10上安装TensorFlow 2.2.0 RC4版
- 大数据_Hbase-API访问_Java操作Hbase_MR-数据迁移-开发代码---Hbase工作笔记0016
- python堆结构heapq
- UnityShader24:最简单的屏幕后处理例子
- excelvba怎么设置不打开文件自动保存_Excel VBA之工作薄 5.5批量工作薄标准数据的汇总...
- java需要了解的几个算法
- 双十一,咪蒙广告位为何供不应求?
- Java算法:经纬度转换 将百度转为高德经纬度
- 2020科协竞赛部第一次培训
- c语言中cap捕捉函数,CAP理论的理解
- 调试利器之wireshark
- TVS管与ESD保护二极管的区别
热门文章
- SpringBoot实战教程(3)| 整合Thymeleaf
- Docker 安装 MongoDB教程
- 手把手教你启动若依单体项目
- 牛客网练习赛26B(简单的dp)
- Echarts pie 饼图类型后显示数据
- jmap查看java进程占用的数据库连接数
- JDBC未设置socket超时导致应用程序的线程池阻塞
- python安装email模块,python 3.4.0电子邮件包安装:ImportError:没有名为'cStringIO'的模块...
- html div画圆有什么用,圆形div栏,用于评级html5 js(Circle div bar for rating html5 js)
- jpa 托管_JPA EntityManager详解(一)