博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
组合模式
阅读量:1870 次
发布时间:2019-04-26

本文共 2073 字,大约阅读时间需要 6 分钟。

什么是组合模式?

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

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

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

代码结构

//抽象类或接口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
children = new List
(); 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.如果要增加新的叶子节点,直接添加一个新类就可以,符合“开闭原则”,更加灵活。

适用情况

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

组合模式多用来处理树形结构。

你可能感兴趣的文章
linux入门--磁盘管理之分区、格式化与挂载
查看>>
鸿蒙(二)基于小熊派实现LOT上云的智慧家居项目
查看>>
开发必备:HTTP 及 TLS
查看>>
Shopify!Shopify!Shopify!
查看>>
你想成为数据科学家吗?不要把机器学习当成入门第一课
查看>>
如何设计自己的第一个加密交易机器人?
查看>>
失业三星期:我寻找第二份编程工作之路
查看>>
服务器宕机:谷歌最近经历了“黑客攻击”吗?
查看>>
提升查询技能,这7条SQL查询错误必须解决
查看>>
TKDE 2020 | 综述:基于知识图谱的推荐系统
查看>>
休息时间!哪些业余活动能提升开发人员的技能?
查看>>
把人脑“森林”上传到计算机:人类脑计划只是一个科幻野心?
查看>>
智力测试:如何超越动物之智?
查看>>
事关人类生存?为什么要探寻AI系统的可解释性?
查看>>
安全工程师必知:常见Java漏洞有哪些?
查看>>
数据科学中的计量经济学技术
查看>>
突破边界:数据科学、数据工程和技术的未来
查看>>
一切有迹可循!优秀程序员的9个早期迹象
查看>>
在后台的python:众多程序员无法攻克的难题
查看>>
未来战争:装载AI的美国空军侦察机已经试飞……
查看>>