设计模式-组合模式
一、组合模式引入
1、组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
简单理解就是,如果有许多相似的对象,每个对象的某个方法都必须被执行,那不需要显式的使用每个具体对象调用它的方法。而是把这些相似对象使用树形结构组合起来。通过递归的方式,从根节点开始递归下去调用每个对象的方法。
二、示例说明
1、找出所有某个文件夹下面的文件夹和子文件夹。
2、公司的项目提成分配。公司每个部门、每个员工都可能有项目提成,有些比例高有些比例少。比如1000w,产品部门分0.2,开发部门分0.2,实施部门分0.2,销售部门分0.4,而每个部门下面可能又有项目经理、产品经理、开发人员(高级中级低级)、测试人员(高级中级低级)。
/// <summary> /// 机构/个人 /// </summary> public abstract class AbstractDomain { public string Name { get; set; } public double Percent { get; set; } public abstract void Commission(double total); public abstract void AddChild(Domain domainChild); }
Commission方法就是提成金额到达该层级剩余的钱乘以该员工在该部门的分配比例。
AddChild方法就是把属于该部门的人员加进来。
/// <summary> /// 机构/个人 /// </summary> public class Domain : AbstractDomain { private List<Domain> DomainChildList = new List<Domain>(); public override void AddChild(Domain domainChild) { this.DomainChildList.Add(domainChild); } public override void Commission(double total) { double result = total * this.Percent / 100; Console.WriteLine("this {0} 提成 {1}", this.Name, result); foreach (var domainChild in DomainChildList) { domainChild.Commission(result); } }
Commission方法在分完本层级的钱后,递归调用属于本层级的对象,完成向下分成。
此时在搭建好部门树形结构的基础上,上端调用方式就很简单了。
double total = 1000000; Domain domain = BuildTree(); domain.Commission(total);
domain此时是根节点。