组合模式

什么是组合模式?

组合模式:使得用户对单个对象和组合对象的使用具有一致性,使得部分和整体可以被一致对待。

组合模式其实就是将单个对象和组合对象抽象出来,让单个对象和组合对象去继承这个抽象类,从而使客户端可以针对抽象接口编程,这样就实现了一致对待。通过抽象的方式,形成一个模式,叫做组合模式,为了可以使代码有更好的灵活可扩展性,符合“开闭原则”。

这里写图片描述
这里写图片描述

代码结构
//抽象类或接口
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 Display(int depth)
    {
        Console.WriteLine(new string('-',depth) + name);
        foreach (Company compoment in children)
        {
            compoment.Display(depth + 2);
        }
    }

    public override void LineOfDuty()
    {
        foreach (Company compoment in children)
        {
            compoment.LineOfDuty();
        }
    }

    public override void Remove(Company c)
    {
        children.Remove(c);
    }
}
//叶子节点
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);
    }

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

    public override void Remove(Company c)
    {   
    }
}
透明组合 and 安全组合

这里写图片描述
透明组合模式:抽象类中声明了所有的管理方法,所以叶子节点类和树枝节点类中也必须实现相应的方法。由于它们继承自相同的抽象类,这样的好处是客户端可以对它们一致对待。但是缺点是不够安全,因为 Leaf 类不可能再有子对象,但是却实现了管理对象的方法,这样有可能会出错,如果 Leaf 类没有错误处理的代码。

所以,用透明组合模式最好要对叶子节点类做错误处理。
这里写图片描述
安全组合模式:抽象类中不声明管理对象的方法,所以 Leaf 类中也没有相应的方法,这样在使用 Leaf 类时就不会出错了,而 Composite 类需要自己添加管理对象的方法。但是这样做的缺点是:由于 Leaf 类和 Composite 类有区别,所以客户端就无法针对抽象接口编程,需要区别对待它们。

组合模式的优点

1.客户端可以一致地使用一个组合结构或其单个对象,不必关心处理的是哪一种。
2.如果要增加新的叶子节点,直接添加一个新类就可以,符合“开闭原则”,更加灵活。

适用情况

当在部分与整体的层次结构中,客户希望可以忽略组合对象和单个对象的不同,可以一致对待它们时,就可以用组合模式。
组合模式多用来处理树形结构。

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值