设计模式(六)学习----组合模式
2023-09-14 08:57:13 时间
待补充图,定义等。
1.为组合中的对象申明接口
package desigh.commands.composites; /** * * * @author lipeng24@meituan.com * @create 2017-10-26 下午7:56 **/ public interface ComponentFile { /** * 操作文件 */ void operate(); /** * 钩子函数,判断是否是文件 * * @return */ boolean isFile(); }
package desigh.commands.composites; import java.util.ArrayList; import java.util.List; /** * * * * ComponentFile文件夹, * <p> * 1.容器对象,用于存储子部件,比如文本文件,图像文件,视频文件 * 2.实现与子部件有关的行为操作(例如增加,删除操作) * 3.定义有子部件的那些行为 * * ComponentFile * * 1.为组合中的对象声明接口(文件对象) * * ImageFileLeaf,TextFileLeaf,VideoFileLeaf叶子节点 * 1.叶子节点没有子节点,表示叶子对象 * * * 参考项目中的ticket_order项目的: * * 组合对象中声明的接口的方法 * //1.Component * Logic * //2.composite 组合对象 * CompositeLogic * //3.leaf 叶子节点 * ACKSuccessLogicUnit * * * @author lipeng24@meituan.com * @create 2017-10-26 下午8:03 **/ public class CompositeFolder implements ComponentFile { private String name; public CompositeFolder(String name) { this.name = name; } private List<ComponentFile> childFiles = new ArrayList<>(); /** * ComponentFile 中子部件共有的行为 */ @Override public void operate() { for (ComponentFile file : childFiles) { if (file.isFile()) { file.operate(); } else { System.out.println("this is not a file"); } } } @Override public boolean isFile() { return true; } /** * 添加文件 * * @param file */ public void addFile(ComponentFile file) { childFiles.add(file); } /** * 添加文件 * * @param file */ public void removeFile(ComponentFile file) { childFiles.remove(file); } }
2.实现类:
package desigh.commands.composites; /** * 图像文件叶子节点 * * @author lipeng24@meituan.com * @create 2017-10-26 下午8:34 **/ public class ImageFileLeaf implements ComponentFile { private String name; public ImageFileLeaf(String name) { this.name = name; } @Override public void operate() { System.out.println("操作的是图像文件" + name); } @Override public boolean isFile() { return true; } }
package desigh.commands.composites; /** * 文件叶子节点 * * @author lipeng24@meituan.com * @create 2017-10-26 下午8:32 **/ public class TextFileLeaf implements ComponentFile { private String name; public TextFileLeaf(String name) { this.name = name; } @Override public void operate() { System.out.println("操作的是文本文件:" + name); } @Override public boolean isFile() { return true; } }
package desigh.commands.composites; /** * 音频文件叶子节点,叶子节点没有子节点 * * @author lipeng24@meituan.com * @create 2017-10-26 下午8:36 **/ public class VideoFileLeaf implements ComponentFile { private String name; public VideoFileLeaf(String name) { this.name = name; } @Override public void operate() { System.out.println("操作的是音频文件" + name); } @Override public boolean isFile() { return true; } }
* 优点:
* 1.各个叶子节点足够内聚
* 2.客户端实现简单,可以一直的使用组合对象和单个对象
* 3.可以面向顶层接口,统一做一些事情(eg.是否可降级,是否可异步处理,日志aop等等)
* 4.对扩展开放,很容易的可以在组合对象内加入单个对象, 而客户端不必修改原有代码
*
* 使用场景:
*
* 1.想表示对象的整体和部分的层次,并且在此结构中,希望通过一种方式忽略整体和部分的差异
* 2.希望用户忽略组合对象和单个对象的不同,用户将统一的使用结构中的所有对象。
* 3.可以结合责任链模式,迭代器,装饰器,享元,访问者模式一块使用。
参考:
* 1.https://en.wikipedia.org/wiki/Composite_pattern
* 2.https://foolchild.cn/2016/07/26/composite
* 3.http://www.cnblogs.com/chenssy/p/3299719.html
相关文章
- 使用深度学习模型近似简单的大气环流模式
- ASP.Net MVC开发基础学习笔记:一、走向MVC模式
- 密码库LibTomCrypt学习记录——(2.12)分组密码算法的工作模式——OMAC认证模式
- 零基础学习设计模式之装饰器模式(文档)
- 从简单到复杂学习任务调度(2)-xxl-job基本原理和使用
- 学习笔记 | Android开发常用的几种模式
- 一起学习设计模式--09.组合模式
- Linux源码学习笔记day6 模式转换是什么鬼?
- 图计算的学习与思考
- Redis学习之Redis集群模式缺陷及其处理详解数据库
- javaweb学习总结(二十一)——JavaWeb的两种开发模式详解编程语言
- Java学习笔记之三十详解Java单例(Singleton)模式编程语言
- [javaSE] 看知乎学习工厂模式详解编程语言
- [PHP] 看博客学习观察者模式详解编程语言
- java学习笔记14–动态代理详解编程语言
- Linux下学习cat命令,快速实现文件读写(linux中cat命令)
- 学习新版Linux:视频教程带你走(新版linux视频教程)
- 无门槛 | 学习Linux C编程规范,让您规范代码,轻松拥抱编程大佬。(linuxc编程规范)
- 快速掌握深度学习 Oracle 修改操作技巧(c oracle修改操作)
- 利用咕泡学院 Redis 进行高效学习(咕泡学院redis)
- php正则表达式学习笔记
- JavaScript语言精粹学习笔记
- Android源码学习之单例模式应用及优点介绍
- Android源码学习之工厂方法模式应用及优势介绍
- MongoDB学习笔记(三)在MVC模式下通过Jqgrid表格操作MongoDB数据
- java单例模式学习示例
- java设计模式之单例模式学习