zoukankan      html  css  js  c++  java
  • 组合模式 -- 大话设计模式

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

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

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

      

  • 相关阅读:
    js bubbleSort
    关于“ ,”的迷
    移位
    emacs 一些很有用的快捷键
    input&output
    async&await
    用dbforge调试procedure
    开发中常用的工具
    用Firefox的debugger来调试JavaScript
    Hibernate映射关系配置
  • 原文地址:https://www.cnblogs.com/amywechat/p/4929244.html
Copyright © 2011-2022 走看看