设计模式之组合模式
Composite(组合模式)
一、组合模式简介
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
核心:
- 1、抽象构件角色:定义叶子和容器构件的共同点
- 2、叶子构件角色:无子节点
- 3、容器构件角色:有容器特征,可包含子节点
二、组合模式优缺点比较
优点:
- 1、高层模块调用简单
- 2、节点自由增加
缺点:
- 1、在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
使用场景:
- 1、树形菜单,文件、文件夹的管理
- 2、XML文件解析、组织结构的管理(OA)、资源管理器
注意事项:定义时为具体类
三、UML类图
四、实现
步骤1:创建抽象构件接口
/** * 抽象构件 : 定义叶子节点和容器节点构件的共同点 * @author yw */ public interface AbstractFile { //文件杀毒 public void killVirus(); }
步骤2:创建实现抽象构件接口的叶子节点
/** * Leaf : 叶子节点,无子节点 * @author yw */ public class TxtFile implements AbstractFile { private String name; public TxtFile(String name) { this.name = name; } @Override public void killVirus() { System.out.println("<<<文本文件:"+name+",进行查杀>>>"); } } // * Leaf : 叶子节点,无子节点 public class VedioFile implements AbstractFile { private String name; public VedioFile(String name) { this.name = name; } @Override public void killVirus() { System.out.println("<<<视频文件:"+name+",进行查杀>>>"); } }
步骤3:创建实现抽象构件接口的容器构件
public class Folder implements AbstractFile { private String name; List<AbstractFile> lists = new ArrayList<>(); public void add(AbstractFile file) { lists.add(file); } public void remove(AbstractFile file) { lists.remove(file); } public AbstractFile getFile(int index) { return lists.get(index); } public Folder(String name) { this.name = name; } @Override public void killVirus() { System.out.println("<<<文件夹:"+name+",进行查杀>>>"); for (AbstractFile abstractFile : lists) { abstractFile.killVirus(); } } }
步骤4:调用者测试
public class CompositeDemo01 { public static void main(String[] args) { AbstractFile f2,f3,f4,f5; Folder f1 = new Folder("我的收藏夹"); f2 = new TxtFile("menu.txt"); f3 = new VedioFile("learn.avi"); f1.add(f2); f1.add(f3); Folder f11 = new Folder("喜欢的电影"); f4 = new VedioFile("无心法师.mp4"); f5 = new VedioFile("斗破苍穹.mp4"); f11.add(f4); f11.add(f5); f1.add(f11); f1.killVirus(); } }
步骤5:运行程序,观察结果
posted on 2020-04-01 22:15 VincentYew 阅读(272) 评论(0) 收藏 举报