设计模式——组合模式

  组合模式是设计中非常重要的一个模式,下面是我对组合模式的一个简单总结。

    名字:

        组合模式

    

    定义:

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


    类图:

      

    

    

    优点:

       一、       定义了组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,不断的递归下去,客户端代码中,任何用到基本对象的地方都可以使用组合对象
       二、       用户不用关心是处理一个叶节点还是处理一个组合组件,用不着为定义组合写选择判断语句,也就是说组合模式让客户一致地使用组合结构和单个对象。


    缺点:    

      一、       使用组合模式后,控制树枝构件的类型不太容易

      二、       用继承的方法来增加新的行为很困难


    何时用?

      一、      需求中是体系那部分与整体层次结构时;

      二、      希望用户可以忽略单个对象的不同,统一的手工组合结构中的所有对象时


    代码实现:

       抽象类或接口

<span style="font-size:18px;">//抽象类或接口
    abstract class Company
    {
        protected string name;
        public Company(string name)
        {
            this.name = name;
        }
        public abstract void add(Company c);
        public abstract void display(int depth);
        
    }
</span>
      

       树枝节点:

       

<span style="font-size:18px;">//树枝节点
    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 display(int depth)
        {
            Console.WriteLine (new string ('-',depth)+ name)

            foreach (Company component in children)
            {
                component.display (depth + 2);
            }
        }
     }
</span>

    树叶节点:

      

<span style="font-size:18px;">//叶节点
    class HRdepartment : Company 
    {
        public HRdepartment(string name)
            : base(name)
        { }

        public override void add(Company c)
        { }

        //显示
        public override void display(int depth)
        {
            Console.WriteLine (new string ('-',depth )+ name)
        }
    }
</span>

    尤为注意的是不要忽略了树枝节点与树叶节点的区别。


    备注:      

      透明方式:在公司抽象类中声明所有用来管理子对象的方法,这样实现公司接口的所有子类都具备了add和remove

             好处:叶节点和枝节点对于外界没有区别,且具备一直的行为接口。

             缺点:叶节点类本身不具备add()、remove()的方法功能,实现它没有意义。

      安全方式:在公司抽象类中不去声明add和remove方法,子类的叶节点也就不需要去实现它,而是在枝节点声明所有管理子类对象的方法。

            优点:避免了透明方式存在的问题。

            缺点:由于不够透明,所有树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,非常不方便。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值