结构型模式——组合模式
Posted wq-7047
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式——组合模式相关的知识,希望对你有一定的参考价值。
视频连接:B站审核中……
1定义
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
2作用与意义
l 意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
l 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
l 何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
l 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。
组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。
- 统一元素与部分整体,简化处理代码。
- 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。
- 实际上,组合模式在应用中其实非常广泛,像文件系统、企业结构等都可以看做是组合模式的典型应用。
- Component:定义成接口或者抽象类,是元素与不部分整体的父类。
- Leaf:叶子节点,定义了基本元素的特征,继承自Component父类,是整体最基本的组成部分。
- Composite:部分整体或者容器,继承或实现自Component父类。内部包含Composite或者Leaf的聚合,用来保存内部的组织结构,并且针对该聚合有相应的操作方法。
组合模式(Component)结构图
3应用
- 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式。
- 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候。
- 对象的变化是动态,而客户端想要一致的处理对象的时候。
- 组合模式意图是通过整体与局部之间的关系,通过树形结构的形式进行组织复杂对象,屏蔽对象内部的细节,对外展现统一的方式来操作对象,是我们处理更复杂对象的一个手段和方式。公司OA系统如何进行设计有关于此。
综上,在上述几种情况下可以考虑使用组合模式来设计系统程序。组合模式关键定义了一个抽象类或者接口,既可以代表元素又可以代表部分整体,而客户端是针对该接口进行编程。
4案例实现
例:公司管理系统
公司管理系统结构图
公司类 抽象类或接口
abstract class Company { protected string name; public Company (string name) { this.Name=name; } public abstract void Add (Company c) ;//增加 public abstract void Remove (Company c) ;//移除 public abstract void Display (int depth) ;//显示 public abstract void LineOfDuty () ;//履行职责 }
具体公司类 实现接口 树枝节点
class ConcreteCompany : Company { private List<Company>children = new List<Company> () ; public ConcreteCompany (string name) :base(name) { } public override void Add (Company c) { children.Add(c); } public override void Remove (Company c) { children.Remove(c); } public override void Display (int dapth) { Console. WriteLine (new String(‘-‘ ,depth) + name) ; foreach (Company component in children) { component.Display (depth + 2) ; } } //履行职责 public override void LineOfDuty () { foreach (Company component in children) { component.LineOfDuty () ; } } }
人力资源部与财务部类 树叶结点
//人力资源部 class HRDepartment : Company { public HRDepartment (string name): base (name) { } public override void Add (Company c) { } public override void Remove (Company c) { } public override void Display ((int dapth) { Console. WriteLine (new String(‘-‘ ,depth) + name) ; } public override void LineOfDuty () { Console. WriteLine (“{0} 员工招聘培训管理”,name) ; } } //财务部 class FinanceDepartment : Company { public FinanceDepartment (string name) : base (name) { } public override void Add (Company c) { } public override void Remove (Company c) { } public override void Display ((int dapth) { Console. WriteLine (new String(‘-‘ ,depth) + name) ; } public override void LineOfDuty () { Console. WriteLine (“{0} 公司财务收支管理”,name) ; } }
组合模式定义了包含人力资源部和财务部这些基本对象和分公司、办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,这样在客户代码中,任何用到基本对象的地方都可以使用组合对象了。
参考链接:
https://wiki.mbalib.com/wiki/Composite_pattern
https://www.runoob.com/design-pattern/composite-pattern.html
以上是关于结构型模式——组合模式的主要内容,如果未能解决你的问题,请参考以下文章