用最简单的例子理解复合模式(Composite Pattern)
在显示树形结构时,复合模式有很好的体现。本篇显示如下部门结构:

以上,有的节点包含子节点,有的节点部包含子节点。不管是什么节点,每个节点就代表一个部门。
首先设计一个关于部门的抽象基类。
public abstract class DepartmentComponent{public string Name { private set; get; }public DepartmentComponent(string name){this.Name = name;}public virtual void PrintSupervisorOf(int spacing){for (int counter = 0; counter < spacing; counter++){Console.Write(" ");}Console.WriteLine(Name);}}
以上,通过构造函数给属性赋值,通过PrintSupervisorOf(int spacing)方法打印出节点的名称。
接下来设计包含子节点的节点。该类维护着DepartmentComponent类型的集合,提供方法向这个集合中添加节点或从集合中删除节点。
public class DepartmentComposite : DepartmentComponent{private IList<DepartmentComponent> employees;public DepartmentComposite(string name) : base(name){employees = new List<DepartmentComponent>();}public void AddDepartment(DepartmentComponent e){employees.Add(e);}public void RemoveDepartment(DepartmentComponent e){employees.Remove(e);}public override void PrintSupervisorOf(int spacing){base.PrintSupervisorOf(spacing);foreach (DepartmentComponent e in employees){e.PrintSupervisorOf(spacing + 1);}}}
以上 PrintSupervisorOf(int spacing)方法重写了抽象基类的方法,不仅把本节点的名称打印出来,还使用递归把所有子节点的名称显示出来。
最后设计部包含子节点的节点。
public class Department : DepartmentComponent{public Department(string name) : base(name){}public override void PrintSupervisorOf(int spacing){base.PrintSupervisorOf(spacing);}}
客户端部分。
class Program{static void Main(string[] args){DepartmentComposite salesDepartment1 = new DepartmentComposite("销售部1");Department zhangsan = new Department("张三");Department lisi = new Department("李四");DepartmentComposite salesDepartment2 = new DepartmentComposite("销售部2");DepartmentComposite specialDepartment = new DepartmentComposite("销售部2特别行动组");Department wangwu = new Department("王五");Department zhaoliu = new Department("赵六");DepartmentComposite salesDepartment = new DepartmentComposite("销售部");salesDepartment.AddDepartment(salesDepartment1);salesDepartment.AddDepartment(salesDepartment2);salesDepartment1.AddDepartment(zhangsan);salesDepartment1.AddDepartment(lisi);salesDepartment2.AddDepartment(specialDepartment);specialDepartment.AddDepartment(wangwu);specialDepartment.AddDepartment(zhaoliu);salesDepartment.PrintSupervisorOf(0);Console.ReadKey();}}

用最简单的例子理解复合模式(Composite Pattern)的更多相关文章
- 用最简单的例子理解备忘录模式(Memento Pattern)
简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...
- 用最简单的例子理解命令模式(Command Pattern)
假设想让遥控器控制电灯的开关.电视机的开关和切换,该如何做? 所有的开.关.切换都是遥控器发出的指令,把这些指令统一抽象成一个接口. public interface IControl { void ...
- 用最简单的例子理解迭代器模式(Iterator Pattern)
迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...
- 用最简单的例子理解模板方法模式(Template Method Pattern)
假设要做一道红烧肉,做法有很多,在不同的做法中都有相同的部分,比如都要放油.放肉.放调料等.也有不同之处,比如有些做法放可乐,有些做法放甜蜜酱,等等. 先提炼出一个抽象类,该类不仅有制作红烧肉的各个步 ...
- 最简单的例子理解Javascript闭包
理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
随机推荐
- ubuntu12.04安装ruby2.3
为了搭建github-pages博客,而github-pages后端依赖于ruby,且对版本有严格要求,自己尝试了各种姿势升级ruby2.3无果,最终在查阅了各种资料之后找到一个可行方案. icebu ...
- 四B象限图
- Ad Hoc Distributed Queries的启用与关闭
启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1 reconfigure exec sp_config ...
- InterSystems Ensemble学习笔记(一) Ensemble介绍及安装
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- 使用ngx_lua构建高并发应用
http://blog.csdn.net/chosen0ne/article/details/7304192
- ASP.NET Identity 修改表名和主键类型
public class UserLogin : IdentityUserLogin<Guid> { } public class UserRole : IdentityUserRole& ...
- python opencv入门-形态学转换
目标: 学习不同的形态操作 例如 腐蚀.膨胀.开运算.闭运算 等. 我们要学习的函数有 cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等. 原理 :一般对二值 ...
- [js]DOM 篇
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model).它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作 ...
- Linux教程 - 管道和重定向
管道和重定向! 保持数据流动 介绍 在前两节中,我们看了一些可以为我们操作数据的过滤器.在本节中,我们将看到我们如何将它们结合在一起来执行更强大的数据操作. 本节涉及一些阅读.即使这些机制及其 ...
- apache 监控
当前加载模块 [root@controller01 ~]# httpd -lCompiled in modules: core.c mod_so.c http_core.c 当前版本[root@con ...