组合模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
1.薪水结算
小A被聘请为XX分公司的总经理。组建人资团队,招聘了一个经理小B和两个员工小D、小E;组建技术团队,招聘了一个经理小C;一个月后,小A核算了一下自己这个月薪水的总支出……
声明一个接口,便于访问和管理节点部件
/// <summary> /// 声明一个接口,便于访问和管理节点部件 /// </summary> public abstract class SalaryComponent { protected string _name; protected int _salary; public SalaryComponent(string name, int salary) { this._name = name; this._salary = salary; } /// <summary> /// 添加树叶或者树枝 /// </summary> public abstract void Add(SalaryComponent component); /// <summary> /// 移除树叶或者树枝 /// </summary> public abstract void Remove(SalaryComponent component); /// <summary> /// 核算薪资(具体业务) /// </summary> public abstract int Calculate(); }
定义一个树枝节点对象--经理类
/// <summary> /// 经理类(树枝节点对象) /// </summary> public class Manager : SalaryComponent { private List<SalaryComponent> list = new List<SalaryComponent>(); public Manager(string name, int salary) : base(name, salary) { } public override void Add(SalaryComponent component) { list.Add(component); } public override void Remove(SalaryComponent component) { list.Remove(component); } public override int Calculate() { int total = this._salary; foreach (var v in list) { total += v.Calculate(); } return total; } }
定义一个叶节点对象--员工类
/// <summary> /// 员工类(叶节点对象) /// </summary> public class Staff : SalaryComponent { public Staff(string name, int salary) : base(name, salary) { } public override void Add(SalaryComponent component) { Console.WriteLine("{0}是一个叶节点,不提供新增下级节点功能"); } public override void Remove(SalaryComponent component) { Console.WriteLine("{0}是一个叶节点,不提供移除下级节点功能"); } public override int Calculate() { return this._salary; } }
开始场景模拟
static void Main(string[] args) { //小A被聘请为XX分公司的总经理 Manager a = new Manager("小A", 10000); //组建人资团队,招聘了一个经理小B和两个员工小D、小E Manager b = new Manager("小B", 8000); Staff d = new Staff("小D", 3000); Staff e = new Staff("小E", 3000); b.Add(d); b.Add(e); //组建技术团队,招聘了一个经理小C Manager c = new Manager("小C", 8000); a.Add(b); a.Add(c); //一个月后,小A核算了一下自己这个月薪水的总支出 Console.WriteLine("小A分公司薪水支出{0}元", a.Calculate()); }