在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
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());
}