文章出處

在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……

組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性

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());
        }

 

  


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()