前言:
组合设计模式也叫Composite模式,是构造型的设计模式之一,用来表示整组对象的树形结构,其实就是把数据整合成树形结构。
怎么实现:
1.抽象根节点,树形结构节点的抽象
2.具体叶子节点
3.具体枝节点
代码:
枝和叶子的抽象父类:
package com.xhx.designpattern;
import java.util.List;
/**
* xuhaixing
* 2018/7/6 8:42
*
* 文件节点抽象(是文件和目录的父类)
**/
public abstract class IFile {
protected String name;
public IFile(String name){
this.name=name;
}
//显示文件或者文件夹的名称
public abstract void display();
//添加
public abstract boolean add(IFile iFile);
//移除
public abstract boolean remove(IFile iFile);
//获得子节点
public abstract List<IFile> getChild();
}
子类叶子节点:
package com.xhx.designpattern;
import java.util.List;
/**
* xuhaixing
* 2018/7/6 8:44
**/
public class File extends IFile {
public File(String name){
super(name);
}
public void display() {
System.out.println(name);
}
public boolean add(IFile iFile) {
return false;
}
public boolean remove(IFile iFile) {
return false;
}
public List<IFile> getChild() {
return null;
}
}
子类枝节点:
package com.xhx.designpattern;
import java.util.ArrayList;
import java.util.List;
/**
* xuhaixing
* 2018/7/6 8:46
**/
public class Folder extends IFile {
private List<IFile> children;
public Folder(String name){
super(name);
children = new ArrayList<IFile>();
}
public void display() {
System.out.println(name);
}
public boolean add(IFile iFile) {
return children.add(iFile);
}
public boolean remove(IFile iFile) {
return children.remove(iFile);
}
public List<IFile> getChild() {
return children;
}
}
测试方法,用递归的方式做循环
package com.xhx.designpattern;
import java.util.List;
import java.util.Objects;
import java.util.Observer;
/**
* xuhaixing
* 2018/7/6 8:50
**/
public class App {
public static void main(String[] args) {
Folder root = new Folder("c:");
Folder rootFolder = new Folder("program files");
File cmdFile = new File("cmd.exe");
root.add(rootFolder);
rootFolder.add(cmdFile);
displayTree(root);
}
public static void displayTree(IFile root){
if(Objects.isNull(root)){
return;
}
root.display();
List<IFile> child = root.getChild();
if(Objects.isNull(child)||child.size()<=0){
return;
}
child.stream().forEach(iFile->displayTree(iFile ));
}
}