组合模式总结

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

组合模式理解
组合模式就是当我们所要处理的事件,存在层级关系,并且各个层级所要处理的事件所要应用的方法其实是一样的时候,我们就要应用到组合模式了。
就比如,一个大公司,有多个分公司。大公司人员管理部门和财务管理部门。分公司也有人员管理部门和财务管理部门。
在上面这个例子中大公司和分公司存在层级关系,而大公司和分公司的人员管理部门和财务管理部门的职能是相同的。

何时使用组合模式
当需求中体现部分与整体层次的结构时,以及希望用户可以忽略组合对象(总公司)与单个对象(分公司)的不同,统一的使用组合对象中的所有对象(人员管理部门和财务管理部门)时,就应该考虑用组合模式

组合模式的优点
因为组合模式中不管是组合对象还是单个对象,他们所拥有的功能是一样的,所以都能解决客户的问题。

第一步建立公司类抽象接口

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 Add(Company c)
        {
            children.Add(c);
        }
		//移除子公司或者部门
        public override void Remove(Company c)
        {
            children.Remove(c);
        }
 
		//遍历数组children
        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + name);
            foreach (var component in children )
            {
                component.Display(depth + 2);
            }
        }
		//显示部门职责
        public override void LineOfDuty()
        {
            foreach (var company in children )
            {
                company.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);
        }
    }

第四步客户端类


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

最终结果

结构图
-北京总公司
—总公司人力资源部
—总公司财务部
—上海华东公司
-----上海华东公司人力资源部
-----上海华东公司财务部
-----南京办事处
-------南京办事处人力资源部
-------南京办事处财务部
-----杭州办事处
-------杭州办事处人力资源部
-------杭州办事处财务部

职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
上海华东公司人力资源部员工招聘培训管理
上海华东公司财务部公司财务收支管理
南京办事处人力资源部员工招聘培训管理
南京办事处财务部公司财务收支管理
杭州办事处人力资源部员工招聘培训管理
杭州办事处财务部公司财务收支管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值