组合模式
来源:互联网 发布:松下触摸屏编程软件 编辑:程序博客网 时间:2024/06/04 18:48
组合模式
组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,用户不用关心自己处理的是叶子节点还是组合节点。
举例说明,文件系统中Folder表示目录,File表示具体的文件,目录下面有子目录和文件,这其实就是一个明显的树形结构。本文假设文件是一种特殊的目录,File和Folder具有“部分-整体“的特性,File作为树的叶子存在,Folder作为树的非叶子存在。根据这个例子,我们看下组合模式的类图:
UML类图
抽象基类Folder定义了目录所具有的操作,包括增加、删除和展示。
File类继承了Folder类,它是一个文件,是树中一个叶子节点,叶子节点不具有增加、删除文件/目录的功能,因此这两个操作在File类中是空实现。
ConcreteFolder也继承了Folder类,它代表了具体的目录,是树中非叶子节点。ConcreteFolder类中的增加、删除和展示操作都有具体的实现。
接下来看代码实现。
代码实现
首先看下抽象基类Folder
Folder
/** * <p>文件描述: 文件和目录的抽象基类</p> * * @Author luanmousheng * @Date 17/9/16 下午10:47*/public abstract class Folder { protected String name; public Folder(String name) { this.name = name; } public abstract void add(Folder folder); public abstract void remove(Folder folder); public abstract void display(int depth);}
File
/** * <p>文件描述: 文件类(叶子节点)</p> * * @Author luanmousheng * @Date 17/9/16 下午10:49*/public class File extends Folder { public File(String name) { super(name); } @Override public void add(Folder folder) { //空实现 } @Override public void remove(Folder folder) { //空实现 } @Override public void display(int depth) { if (depth > 0) { for ( int i = 0; i < depth; i++) { System.out.print("-"); } } System.out.println("file-" + name); }}
ConcreteFolder
/** * <p>文件描述: 目录类(非叶子节点)</p> * * @Author luanmousheng * @Date 17/9/16 下午10:49*/public class ConcreteFolder extends Folder { //保存了该目录下所有的文件和目录 private List<Folder> folders = new ArrayList(); public ConcreteFolder(String name) { super(name); } @Override public void add(Folder folder) { if (folder != null) { folders.add(folder); } } @Override public void remove(Folder folder) { if (folder != null) { folders.remove(folder); } } @Override public void display(int depth) { if (depth > 0) { for (int i = 0; i < depth; i++) { System.out.print("-"); } } System.out.println("folder-" + name); for (Folder folder : folders) { folder.display(depth + 2); } }}
CompositeDemo
/** * <p>文件描述: 组合模式测试类</p> * * @Author luanmousheng * @Date 17/9/17 上午9:03*/public class CompositeDemo { public static void main(String[] args) { Folder root = new ConcreteFolder("1"); Folder folder1_1 = new ConcreteFolder("1.1"); Folder folder1_2 = new ConcreteFolder("1.2"); Folder file1_1 = new File("1.1"); root.add(folder1_1); root.add(folder1_2); root.add(file1_1); folder1_1.add(new File("1.1.1")); folder1_1.add(new ConcreteFolder("1.1.1")); folder1_2.add(new File("1.2.1")); root.display(1); }}
测试类中,首先新建一个根目录root,在根目录下创建两个子目录1.1和1.2、一个文件1.1。在目录1.1下创建了一个文件1.1.1和一个目录1.1.1,在目录1.2下创建了一个文件1.2.1。
看下该类的运行结果:
-folder-1---folder-1.1-----file-1.1.1-----folder-1.1.1---folder-1.2-----file-1.2.1---file-1.1
阅读全文
1 0
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- ♪ ♩ ♫海的声音-资产配置-30年后拿什么来养活自己
- Mysql (一)
- 栈的创建、返回栈顶元素、删除栈顶元素、插入栈顶元素
- 树的层次遍历,紫书P150UVa122
- HDU 3062 Party(2-SAT模板)
- 组合模式
- 系统设计:关于高可用系统的一些技术方案
- 软件开发工具选择
- 首次适应(FirstFit)算法(空闲区地址递增)
- POJ
- ♪ ♩ ♫海的声音-《管理学的应用题-破局而出》
- 读书笔记之邻家的百万富翁
- C# hijack NSQuery::LookupServiceNext(DNS解析)
- 65. Valid Number