组合模式
发布日期:2021-06-29 11:15:33
浏览次数:2
分类:技术文章
本文共 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 Listchildren = 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.如果要增加新的叶子节点,直接添加一个新类就可以,符合“开闭原则”,更加灵活。
适用情况
当在部分与整体的层次结构中,客户希望可以忽略组合对象和单个对象的不同,可以一致对待它们时,就可以用组合模式。 组合模式多用来处理树形结构。
转载地址:https://blog.csdn.net/zwj_jyzl/article/details/81169703 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月09日 17时45分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
transform 等效转换(参考源码)
2019-04-29
Docker学习(二):Docker基本操作(控制容器)
2019-04-29
Unity之C#学习笔记(0):环境配置与上手 HelloWorld
2019-04-29
高并发高可用秒杀系统(一)
2019-04-29
php如何将base64数据流文件转换为图片文件?
2019-04-29
JavaScript 的addEventListener() 事件监听详解!
2019-04-29
JavaScript的DOMContentLoaded事件和load的区别?
2019-04-29
PHP+JavaScript实现图片预览上传功能开发!
2019-04-29
JSONView - Chrome插件安装详解!(谷歌浏览器插件)!
2019-04-29
上传图片到阿里云OSS和获取上传图片的url的详解 !
2019-04-29
webstorm 和 phpstorm 有什么区别呢?做 WEB 开发用哪个好?
2019-04-29
常见位运算
2019-04-29
武大学生用python敲出樱花开放 | 附源码
2019-04-29
【中文教程】简单粗暴入门TensorFlow 2.0 | 北大学霸出品
2019-04-29
经典面试题:如何保证缓存与数据库的双写一致性?
2019-04-29
一份来自亚马逊工程师的Google面试指南,GitHub收获9.8万星,已翻译成中文
2019-04-29
硬货 | Redis 性能问题分析
2019-04-29
Kafka为什么这么快?
2019-04-29
灵魂四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
2019-04-29
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
2019-04-29