组合模式

组合模式(Composite Pattern),又称之为部分整体模式。将对象组合成树形结果以表示“部分-整体”的层次结果。组合模式使得用户对单个对象的组合对象具有一致性。当需求中国是提现部分与整体层次的结构是,以及希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑组合模式了。
如下所示,一般公司的结构体系就是典型的组合模式范例:

其类结构设计如下:

    public abstract class Company{protected string name;protected List<Company> children;public Company(string name){this.name = name;children = new List<Company>();}public virtual void Add(Company company){children.Add(company);}public virtual void Remove(Company company){children.Remove(company);}public virtual void Display(int depth){Console.WriteLine(new String('-', depth) + name);foreach (var com in children){com.Display(depth + 2);}}/// <remarks>职能</remarks>public abstract void LineOfDuty();}
    /// <remarks>具体公司</remarks>public class ConcreteCompany : Company{public ConcreteCompany(string name) : base(name){}public override void LineOfDuty(){Console.WriteLine("\n{0} 管理下属部门和公司", this.name);foreach (var com in children){com.LineOfDuty();}}}/// <remarks>人力资源部</remarks>public class HRDepartment : Company{public HRDepartment(string name) : base(name){}public override void LineOfDuty(){Console.WriteLine("{0} 员工招聘培训管理", this.name);}}/// <remarks>财务部</remarks>public class FinanceDepartment : Company{public FinanceDepartment(string name) : base(name){}public override void LineOfDuty(){Console.WriteLine("{0} 公司财务收支管理", this.name);}}
 class Program{static void Main(string[] args){ConcreteCompany root = new ConcreteCompany("总部");root.Add(new HRDepartment("总部人力资源部"));root.Add(new FinanceDepartment("总部财务部"));ConcreteCompany company = new ConcreteCompany("西南分公司");company.Add(new HRDepartment("西南分公司人力资源部"));company.Add(new FinanceDepartment("西南分公司财务部"));ConcreteCompany company1 = new ConcreteCompany("成都分公司");ConcreteCompany company2 = new ConcreteCompany("重庆分公司");company.Add(company1);company.Add(company2);root.Add(company);company1.Add(new HRDepartment("成都人力资源部"));company1.Add(new HRDepartment("成都财务部"));company2.Add(new HRDepartment("重庆人力资源部"));company2.Add(new HRDepartment("重庆财务部"));Console.WriteLine("公司结构图:");root.Display(1);Console.WriteLine("职责划分:");root.LineOfDuty();}
执行结果如下所示:
公司结构图:
-总部
---总部人力资源部
---总部财务部
---西南分公司
-----西南分公司人力资源部
-----西南分公司财务部
-----成都分公司
-------成都人力资源部
-------成都财务部
-----重庆分公司
-------重庆人力资源部
-------重庆财务部
职责划分:总部 管理下属部门和公司
总部人力资源部 员工招聘培训管理
总部财务部 公司财务收支管理西南分公司 管理下属部门和公司
西南分公司人力资源部 员工招聘培训管理
西南分公司财务部 公司财务收支管理成都分公司 管理下属部门和公司
成都人力资源部 员工招聘培训管理
成都财务部 员工招聘培训管理重庆分公司 管理下属部门和公司
重庆人力资源部 员工招聘培训管理
重庆财务部 员工招聘培训管理

由上述例子可以看出,采用组合模式可以很容易的构建一套树形结构,对于类似这种分上下层次关系的可以考虑采用组合模式的方式来实现。

设计模式(十一)——树形结构:组合模式相关推荐

  1. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  2. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  3. 设计模式中的结构类模式

    设计模式中的结构类模式 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式. 适配器模式:修饰非血缘关系类,把一个非本家族的对象伪装成本家族的对象,因此它的本质还是非 ...

  4. ios-使用树形结构导航模式

    // 树形结构导航模式 /* 树形结构导航模式也是非常重要的导航模式,它将导航视图控制器(UINavigationController)与表视图(UITableView)结合使用,主要用于构建有从属关 ...

  5. 【学习设计模式11】树形处理——组合模式

    上篇: [学习设计模式10]分离抽象与实现--桥接模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式9]兼容扩展坞-适配器模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式8]组装流水线- ...

  6. 设计模式学习笔记(六) - 组合模式 Composite (树状结构专用模式)

    组合模式 Composite 树状结构专用模式   递归遍历结构

  7. 设计模式的理解:组合模式 (Composite)

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  8. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题 在面向对象系统中,我们常会遇到一类具有"容器"特征的对象--即他们在充当对象的同时,又是其他对象的容器. public ...

  9. 大战设计模式【13】—— 组合模式

    组合模式(Composite) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 组合多个对象形成树形结构以表 ...

  10. 设计模式笔记九:组合模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 组合模式(Composite Pattern) 又叫部分整体模式,是用于 ...

最新文章

  1. Linux编程常见问题
  2. html _ 提取html片段内的纯文本
  3. 深度学习入门之线性模型和梯度下降
  4. jQuery 插件格式 规范
  5. Java基础之字符如何截取?
  6. Builder 模式在 Guava 中的应用
  7. 6. 同步化器(Synchronizers)
  8. selenium实现文件上传方法汇总(AutoIt、win32GUI、sengkeys)---基于python
  9. 颜色转换:十六进制转RGBA并可控制透明度
  10. 小球碰撞(面向对象)
  11. ffmpeg m4a 转pcm_使用ffmpeg解码音频文件到PCM格式
  12. 基于opencv的对CV_16U深度图像MAT中某点的像素值提取问题
  13. SSD1306 芯片 手册官方网址
  14. 主机与虚拟机ping通
  15. Python数据可视化的例子——饼图(pie)
  16. 哄女朋友必备之微信自动发红包脚本(python+adb+androidviewclient)
  17. php字符串处理之全角半角转换(正则匹配全角字符思路)
  18. 9 9简单的数独游戏python_如何使用tkinter gui python创建一个9*9的数独生成器?
  19. Java反射底层原理以及应用
  20. openlayer画的圆比实际的小?4326和3857投影的不同

热门文章

  1. 推荐系统之从石器时代到青铜时代的演进史
  2. 计算机培训机构年终总结范文,2020老师培训年终工作总结范文5篇
  3. java 苹果支付(内购)
  4. movsw 汇编_【汇编】 常用代码段 rep movsw/rep movsw
  5. 网络广告中,CPC、CPA、CPM 的定义各是怎样的?
  6. python什么为假_Python返回真假值(True or False)小技巧
  7. ico图标生成器系统 断网情况下快速生成ico文件
  8. 浅谈shadow dom
  9. 设计师都在用这几个免费素材网站,赶紧马住
  10. python中三角函数运算符_Python入门之三角函数sin()函数实例详解