设计模式(六)学习----组合模式
待补充图,定义等。
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
Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear.
面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!