组合模式(Composite)

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

public abstract class Company
    {
        protected string name;
        public Company(string name)
        {
            this.name = name;
        }
        public abstract void Add(Company company);
        public abstract void Remove(Company company);
        public abstract void Display(int depth);
        public abstract void LineOfDuty();
    }
public class ConcreteCompany:Company
    {
        private IList<Company> companys = new List<Company>();
        public ConcreteCompany(string name)
            :base(name)
        {

        }
        public override void Add(Company company)
        {
            companys.Add(company);
        }

        public override void Remove(Company company)
        {
            companys.Remove(company);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new string('-',depth) + name);
            foreach(var company in companys)
            {
                company.Display(depth + 2);
            }
        }

        public override void LineOfDuty()
        {
            foreach(var company in companys)
            {
                company.LineOfDuty();
            }
        }
    }
public class HRDepartment:Company
    {
        public HRDepartment(string name)
            :base(name)
        {

        }
        public override void Add(Company company)
        {
            
        }

        public override void Remove(Company company)
        {
            
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + name);
        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 员工招聘培训管理",name);
        }
    }
public class FinanceDepartment:Company
    {
        public FinanceDepartment(string name)
            : base(name)
        {

        }
        public override void Add(Company company)
        {
            
        }

        public override void Remove(Company company)
        {
            
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + name);
        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 公司财务收支管理",name);
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Company rootCompany = new ConcreteCompany("北京总公司");
            rootCompany.Add(new HRDepartment("总公司人力资源部"));
            rootCompany.Add(new FinanceDepartment("总公司财务部"));

            Company eastCompany = new ConcreteCompany("华东分公司");
            eastCompany.Add(new HRDepartment("华东分公司人力资源部"));
            eastCompany.Add(new FinanceDepartment("华东分公司财务部"));

            rootCompany.Add(eastCompany);

            Company shanghaiCompany = new ConcreteCompany("上海办事处");
            shanghaiCompany.Add(new HRDepartment("上海办事处人力资源部"));
            shanghaiCompany.Add(new FinanceDepartment("上海办事处财务部"));

            eastCompany.Add(shanghaiCompany);

            Console.WriteLine("机构图:");
            rootCompany.Display(1);

            Console.WriteLine("职责:");
            rootCompany.LineOfDuty();
        }
    }

关于Leaf中也有add和remove。

这种方式叫做透明方式,也就是说在Component中声明所有用来管理子对象的方法,其中包括add,remove等。这样实现Component接口的所有子类都具备了add和remove。这样的好处是叶节点和枝节点

对于外界没有区别,完全一致的接口。问题是,leaf本身并不具备add和remove方法的功能,所以实现它是没有意义的。

安全方式,也就是在Componet接口中不去声明add和remove方法。那么子类的leaf也就不需要去实现它,而在Composite声明所有用来管理子类对象的方法。但是不够透明。树叶和树枝将不具有相同的 接口

,客户端的调用要做相应的判断,带来了不便。

什么地方用:

当需求中是体现部分与整体层次的结构时,以及希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象时,就考虑使用组合模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值