组合模式 -- 大话设计模式

在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

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

 

  

posted @ 2015-11-02 09:32  荒古禁地  阅读(200)  评论(0编辑  收藏  举报