Java设计模式之十四(组合模式)

来源:互联网 发布:怎么在ubuntu上安装qq 编辑:程序博客网 时间:2024/05/29 03:56

一、什么是组合模式

Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。


二、组合模式的结构


三、组合模式的角色和职责

Component (树形结构的节点抽象)

- 为所有的对象定义统一的接口(公共属性,行为等的定义)

- 提供管理子节点对象的接口方法

- [可选]提供管理父节点对象的接口方法

Leaf (树形结构的叶节点)
Component的实现子类

Composite(树形结构的枝节点)
Component的实现子类


代码实现:

Component (树形结构的节点抽象类)

package com.qianyan.composite;import java.util.List;/** * 文件节点抽象(是文件和目录的父类) * @author hadoop * */public interface IFile {/** * 显示文件或者文件夹名称 */public void display();/** * 添加 * @return */public boolean add(IFile file);/** * 删除 * @return */public boolean remove(IFile file);/** * 获取子节点 * @return */public List<IFile> getChild();}

Leaf (树形结构的叶节点类)

package com.qianyan.composite;import java.util.List;public class File implements IFile {private String name;public File(String name) {this.name = name;}@Overridepublic void display() {System.out.println(name);}@Overridepublic boolean add(IFile file) {return false;}@Overridepublic boolean remove(IFile file) {return false;}@Overridepublic List<IFile> getChild() {return null;}}


Composite(树形结构的枝节点类):

package com.qianyan.composite;import java.util.ArrayList;import java.util.List;public class Forder implements IFile {private String name;private List<IFile> children;public Forder(String name) {this.name = name;children = new ArrayList<IFile>();}@Overridepublic void display() {System.out.println(name);}@Overridepublic boolean add(IFile file) {return children.add(file);}@Overridepublic boolean remove(IFile file) {return children.remove(file);}@Overridepublic List<IFile> getChild() {return children;}}

测试类:

package com.qianyan.composite;import java.util.List;public class MainClass {public static void main(String[] args) {//c盘Forder root = new Forder("c:");//qianyan目录Forder qianyanForder = new Forder("qianyan");//qianyan.txt文件File qianyanFile = new File("qianyan.txt");//qianyanChild目录Forder qianyanChildForder = new Forder("qianyanChild");//qianyanChild.txt文件File qianyanChildFile = new File("qianyanChild.txt");//添加qianyanChild目录到qianyan目录qianyanForder.add(qianyanChildForder);//添加qianyanChild.txt文件到qianyan目录qianyanForder.add(qianyanChildFile);//添加qianyanChild目录到c盘root.add(qianyanForder);//添加qianyan.txt文件到c盘root.add(qianyanFile);//显示文件目录结构displayTree(root, 0);}public static void displayTree(IFile root, int deep) {for(int i = 0; i < deep; i++)System.out.print("--");//显示自身的名称root.display();//获得子树List<IFile> children = root.getChild();//遍历子树for(int i = 0; i < children.size(); i++) {IFile file = children.get(i);if(file instanceof File) {for(int j = 0; j <= deep; j++)System.out.print("--");file.display();}elsedisplayTree(file, deep + 1);}}}

测试结果:

c:--qianyan----qianyanChild----qianyanChild.txt--qianyan.txt