一、什麼是組合模式
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