文章出處
文章列表
在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……
組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性
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()); }
文章列表
全站熱搜