一、什么是组合模式
Composite模式也叫组合模式,是构造型的设计模式之一。
通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。
二、组合模式的结构
三、组合模式的角色和职责
Component (树形结构的节点抽象):
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法
Leaf (树形结构的叶节点):
Component的实现子类
Composite(树形结构的枝节点):
Component的实现子类
四、代码示例的实现
package com.dzg.learn.composite;
import java.util.List;
public interface IFile {
//展示文件或者文件夹的名称
public void display();
//添加
public boolean add(IFile file);
//移除
public boolean remove(IFile file);
//获得子节点
public List<IFile> getChild();
}
=======================================
package com.dzg.learn.composite;
import java.util.List;
public class File implements IFile{
private String name;
public File(String name) {
this.name = name;
}
public void display() {
System.out.println(name);
}
public boolean add(IFile file) {
return false;
}
public boolean remove(IFile file) {
return false;
}
public List<IFile> getChild() {
return null;
}
}
=======================================
package com.dzg.learn.composite;
import java.util.ArrayList;
import java.util.List;
public class Folder implements IFile{
private String name;
private List<IFile> children;
public Folder(String name) {
this.name = name;
children = new ArrayList<IFile>();
}
public void display() {
System.out.println(name);
}
public boolean add(IFile file) {
return children.add(file);
}
public boolean remove(IFile file) {
return children.remove(file);
}
public List<IFile> getChild() {
return children;
}
}
===================================
package com.dzg.learn.composite;
import java.util.List;
public class TestComposite {
public static void main(String[] args) {
//f盘下
Folder rootFolder = new Folder("F:");
//我的目录
Folder myFolder = new Folder("myFolder");
//我的文件
File myFile = new File("myFile.txt");
rootFolder.add(myFolder);
rootFolder.add(myFile);
//我的子目录
Folder myChildFolder = new Folder("myChildFolder");
File myChildFile = new File("myChildFile.txt");
myFolder.add(myChildFolder);
myFolder.add(myChildFile);
Folder mmyChildFolder = new Folder("mmyChildFolder");
File mmyChildFile = new File("mmyChildFile.txt");
myChildFolder.add(mmyChildFolder);
myChildFile.add(mmyChildFile);
displayTree(rootFolder,0);
}
public static void displayTree(IFile rootFolder,int level){
for(int i=0;i<level;i++){
System.out.print("--");
}
//显示自身名称
rootFolder.display();
//获取子树
List<IFile> children = rootFolder.getChild();
//遍历子树
for(IFile file:children){
if(file instanceof File){
for(int i=0;i<=level;i++){
System.out.print("--");
}
file.display();
}else{
displayTree(file,level+1);
}
}
}
}
========================================
F:
--myFolder
----myChildFolder
------mmyChildFolder
----myChildFile.txt
--myFile.txt