分公司=一部门——组合模式

1.定义

组合模式(Composite Pattern)又叫部分—总体模式,将对象组合成树形结构以表示‘部分-总体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2.理解

组合模式使我们树型结构的问题中。模糊了简单元素和复杂元素的概念。客户程序能够像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦

组合模式让你能够优化处理递归或分级数据结构。有很多关于分级数据结构的样例。使得组合模式很实用武之地。关于分级数据结构的一个普遍性的样例是你每次使用电脑时所遇到的:文件系统。

文件系统由文件夹和文件组成。每一个文件夹都能够装内容。

文件夹的内容能够是文件,也能够是文件夹。

依照这种方式,计算机的文件系统就是以递归结构来组织的。假设你想要描写叙述这种数据结构。那么你能够使用组合模式Composite。

3.实例

公司管理系统

 //公司类 抽象类或接口
    abstract class Company
    {
        protected string name;
        public Company (string name)
        {
            this.name = name;
        }
        public abstract void Add(Company c);//添加
        public abstract void Remove(Company c);//移除
        public abstract void Display(int depth);//显示
        public abstract void LineOfDuty();//履行职责
    }


 

 //详细公司类 实现接口 树枝节点
    class ConcreteCompany:Company 
    {
        private List <Company >children=new List<Company> ();
        public ConcreteCompany (string name):base(name )
        {}
        public override void Remove(Company c)
        {
 	        children .Remove (c );
        }
        public override void Add(Company c)
        {
 	        children .Add (c );
        }
        public override void Display(int depth)
        {
 	        Console .WriteLine (new string ('-',depth )+name );
            foreach (Company component in children )
            {
                component .Display (depth +2);
            }
        }   
    
    //履行职责
        public override void LineOfDuty()
        {
            foreach (Company component in children )
            {
                component .LineOfDuty ();
            }
        }
    }


 

 //人力资源部与財务部树叶节点
    //人力资源部
    class HRDepartment:Company 
    {
        public HRDepartment (string name):base(name )
        { }
        public override void Add(Company c)
        {
            
        }
        public override void Remove(Company c)
        {
            
        }
        public override void Display(int depth)
        {
            Console .WriteLine (new String ('-',depth )+name );
        }
        public override void LineOfDuty()
        {
            Console .WriteLine ("{0}员工招聘培训管理",name );
        }
    }
    //財务部
    class FinanceDepartment:Company
    {
        public FinanceDepartment (string name):base(name )
        { }
        public override void Add(Company c)
        {
            
        }
        public override void Remove(Company c)
        {
            
        }
        public override void Display(int depth)
        {
            Console .WriteLine (new String ('-',depth )+name );
        }
        public override void LineOfDuty()
        {
            Console .WriteLine ("{0}公司財务收支管理",name );
        }
    }


 

 //client调用
        static void Main(string[] args)
        {
            ConcreteCompany root = new ConcreteCompany("北京总公司");
            root.Add(new HRDepartment("总公司人力资源部"));
            root.Add(new FinanceDepartment ("总公司財务部"));

            ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
            comp.Add(new HRDepartment("华东丰公司人力资源部"));
            comp.Add(new FinanceDepartment("华东分公司財务部"));
            root.Add(comp);

            ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
            comp1.Add(new HRDepartment("南京办事处人力资源部"));
            comp1.Add(new FinanceDepartment("南京办事处財务部"));
            comp.Add(comp1);

            ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
            comp2.Add(new HRDepartment("杭州办事处人力资源部"));
            comp2.Add(new FinanceDepartment("杭州办事处財务部"));
            comp.Add(comp2);

            Console.WriteLine("\n结构图:");
            root.Display(1);

            Console.WriteLine("\n职责");
            root.LineOfDuty();

            Console.Read();
        }


4.长处

组合模式能够让客户一致的使用组合结构和单个对象,组合模式中基本对象能够被组合成更复杂的组合对象。而这个组合对象又能够被组合。这样就不断地递归下去,client代码中,不论什么用到基本对象的地方都能够使用组合对象。用户不用关心究竟是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合而写一些选择推断语句了,降低了代码量就降低了维护量和工作量。

posted @ 2017-08-20 11:32  cxchanpin  阅读(173)  评论(0编辑  收藏  举报