Unity学习笔记:设计模式-COMPOSITE(组合)

关键词:

将对象组织成树形结构

意图

将对象组合成树形结构以表示“部分 -整体”的层次结构。 C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。

适用性

• 你想表示对象的部分 -整体层次结构。

• 你希望用户忽略组合对象单个对象的不同,用户将统一地使用组合结构中的所有对象。

案例:(公司结构 部门-员工  整合获取某一部分员工信息)

namespace FactoryMethod_DesignPattern2
{
    using System;
    using System.Collections;

    public abstract class EmployeeBase//公司
    {
        protected string strName;
        public int salary;//!!

        public EmployeeBase(string name, int salary)
        {
            strName = name;
            this.salary = salary;
        }

        abstract public void Add(EmployeeBase c);
        //abstract public void Add(EmployeeBase[] cs);
        public abstract void DumpContents();

        virtual public int GetSalary()
        {
            return salary;
        }

        // other operations for delete, get, etc.
    }

    public class Manager : EmployeeBase//CEO 部门经理
    {
        private ArrayList employees = new ArrayList();

        public Manager(string s, int salary) : base(s, salary) { }

        override public void Add(EmployeeBase c)
        {
            employees.Add(c);
        }
        public int Count
        {
            get { return employees.Count; }
        }
        public override void DumpContents()
        {
            // First dump the name of this composite node
            Console.WriteLine("Node: {0}", strName);

            // Then loop through children, and get then to dump their contents
            foreach (EmployeeBase c in employees)
            {
                c.DumpContents();
            }
        }
        public EmployeeBase  GetChild(int i)
        {
             return (EmployeeBase)employees[i];
        }
    }

    public class Employee : EmployeeBase
    {
        public Employee(string s, int salary) : base(s, salary) { }

        override public void Add(EmployeeBase c)
        {
            Console.WriteLine("Cannot add to a leaf");
        }

        public override void DumpContents()
        {
            Console.WriteLine("Node: {0}", strName);
        }
    }

    /// <summary>
    ///    Summary description for Client.
    /// </summary>
    public class Client
    {  
        public static void Main(string[] args)
        {
            //EmployeeBase component;
            //Client c = new Client();
            //component = c.SetupTree();

            Employee e1 = new Employee("z1", 10000);
            Employee e2 = new Employee("z2", 10000);
            Employee e3 = new Employee("z3", 10000);
            Employee e4 = new Employee("z4", 10000);
            Employee e5 = new Employee("z5", 10000);
            Employee e6 = new Employee("z6", 10000);
            Employee e7 = new Employee("z7", 10000);
            Employee e8 = new Employee("z8", 10000);
            Employee e9 = new Employee("z9", 10000);

            Manager m1 = new Manager("l1ceo", 50000);
            Manager m2 = new Manager("l市场", 30000);
            Manager m3 = new Manager("l客服", 30000);
            Manager m4 = new Manager("l研发", 30000);
            Manager m5 = new Manager("l研发服务端", 30000);
            Manager m6 = new Manager("l研发客户端", 30000);
            //建立层次关系
            m1.Add(m2);
            m1.Add(m3);
            m1.Add(m4);

            m2.Add(e1);
            m2.Add(e2);

            m3.Add(e3);
            m3.Add(e4);

            m4.Add(m5);
            m4.Add(m6);

            m5.Add(e5);
            m5.Add(e6);

            m6.Add(e7);
            m6.Add(e8);
            m6.Add(e9);

            //计算所有人员的薪水
            var totalSalary = GetAllSalary(m6);
            Console.WriteLine(totalSalary);
            Console.ReadLine();
        }
        public static int GetAllSalary(EmployeeBase emp)
        {
            var salary = emp.GetSalary();
            if (emp is Manager)
            {
                var mgr = emp as Manager;
                for (int i = 0; i < mgr.Count;i++ )
                {
                    salary = salary + GetAllSalary(mgr.GetChild(i));                             
                }
            }
            return salary;
        }
      
    }
}

猜你喜欢

转载自blog.csdn.net/huanyu0127/article/details/107805407