Composite
构造型设计模式之一
通过递归手段来构造树形得对象结构,并可以通过一个对象来访问整个对象树。
组合模式以单一责任设计原则换取透明性。
透明性:通过让组件的接口同时包含一些管理子节点和叶节点的操作,客户就可以将组合和叶节点一视同仁。
角色和职责:
Component(树形结构得节点抽象)
1.为所有的对象定义统一的接口(公共属性,行为等的定义)
2.提供管理子节点对象的接口方法
3.(可选)提供管理父节点对象的接口方法
Leaf(树形结构的叶节点)
Component的实现子类
Composite(树形结构的枝节点)
Component的实现子类
Component
/**
* Component
* 树形节点抽象
*/
public interface IFile {
/**
* 显式文件或者文件夹的名称
*/
public void display();
public boolean add(IFile iFile);
public boolean move(IFile iFile);
/**
* 获得子节点
*/
public List<IFile> getChild();
}
//Composite
/**
*目录
*/
public class Folder implements IFile {
private String name;
//容器存储子节点
private List<IFile> children;
public Folder (String name){
this.name = name;
children = new ArrayList<>();
}
@Override
public void display() {
System.out.println(name);
}
@Override
public boolean add(IFile iFile) {
return children.add(iFile);
}
@Override
public boolean move(IFile iFile) {
return children.remove(iFile);
}
@Override
public List<IFile> getChild() {
return children;
}
}
//Leaf
/**
*文件
*/
package cn.hozi.design_pattern.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 iFile) {
return false;
}
@Override
public boolean move(IFile iFile) {
return false;
}
@Override
public List<IFile> getChild() {
return null;
}
}
public class MainClass {
public static void main(String[] args) {
//C盘
Folder rootFolder = new Folder("C:");
//目录
Folder beifengFolder = new Folder("beifeng");
//文件
File beifendFile = new File("beifeng.txt");
rootFolder.add(beifengFolder);
rootFolder.add(beifendFile);
//beifeng目录
Folder ibeifengFolder = new Folder("ibeifeng");
beifengFolder.add(ibeifengFolder);
//ibeifeng文件
File ibeifengFile = new File("ibefeng.txt");
beifengFolder.add(ibeifengFile);
displayTree(rootFolder,0);
}
public static void displayTree(IFile root,int deep){
for(int i =0;i<deep;i++){
System.out.print("--");
}
root.display();
List<IFile> child = root.getChild();
//遍历子树
for(IFile file : child){
if (file instanceof File){//文件输出
for(int i =0;i<=deep;i++){
System.out.print("--");
}
file.display();
}else {
displayTree(file,deep+1);
}
}
}
}
//结果:
C:
--beifeng
----ibeifeng
----ibefeng.txt
--beifeng.txt