一、什么是组合模式
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;
}
@Override
public void display() {
System.out.println(name);
}
@Override
public boolean add(IFile file) {
return false;
}
@Override
public boolean remove(IFile file) {
return false;
}
@Override
public 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>();
}
@Override
public void display() {
System.out.println(name);
}
@Override
public boolean add(IFile file) {
return children.add(file);
}
@Override
public boolean remove(IFile file) {
return children.remove(file);
}
@Override
public 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();
}
else
displayTree(file, deep + 1);
}
}
}
测试结果:
c:
--qianyan
----qianyanChild
----qianyanChild.txt
--qianyan.txt