組合模式(Composite)
使用組合模式的場景:
把部分和整體的關系用樹形結構來表示,進而使用戶端可以使用統一的方式處理部分對象和整體對象.
組合模式核心:
抽象構件(Component)角色: 定義了葉子和容器構件的共同點
葉子(Leaf)構件角色:無子節點
容器(Composite)構件角色: 有容器特征,可以包含子節點
結構類圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMzEWN5I2NzcjMmFWO5kDO4ETZ0kDZwcDN3AjYyIGMm9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
組合模式工作流程分析:
組合模式為處理樹形結構提供了完美的解決方案,描述了如何将容器和葉子進行遞歸組合,使得使用者在使用時可以一緻性的對待容器和葉子。
當容器對象的指定方法被調用時,将周遊整個樹形結構,尋找也包含這個方法的成員,并調用執行。其中,使用了遞歸調用的機制對整個結構進行處理。
檔案管理案例
Component抽象
/**
* 抽象建構
* @author 波波烤鴨
* @email [email protected]
*
*/
public interface AbstractFile {
/**
* 定義操作的方法
*/
void operiation();
}
Leaf節點
public class ImageFile implements AbstractFile{
private String name;
public ImageFile(String name) {
super();
this.name = name;
}
@Override
public void operiation() {
System.out.println("圖檔檔案:"+name+" 處理操作");
}
}
public class TextFile implements AbstractFile{
private String name;
public TextFile(String name) {
super();
this.name = name;
}
@Override
public void operiation() {
System.out.println("文本檔案:"+name+" 處理操作");
}
}
public class VideoFile implements AbstractFile{
private String name;
public VideoFile(String name) {
super();
this.name = name;
}
@Override
public void operiation() {
System.out.println("視訊檔案:"+name+" 處理操作");
}
}
Composite容器
/**
* Composite容器元件
* @author 波波烤鴨
* @email [email protected]
*
*/
public class Folder implements AbstractFile{
private String name;
// 定義容器,用來存儲葉子節點 也就是存儲檔案
private List<AbstractFile> list = new ArrayList<>();
public Folder(String name) {
super();
this.name = name;
}
public void add(AbstractFile file){
list.add(file);
}
public void remove(AbstractFile file){
list.remove(file);
}
public AbstractFile getChild(int index){
return list.get(index);
}
@Override
public void operiation() {
System.out.println("處理:"+name+"檔案夾");
for (AbstractFile file : list) {
file.operiation();
}
}
}
測試
public static void main(String[] args) {
AbstractFile textFile,imageFile,videoFile;
textFile = new TextFile("readme.txt");
imageFile = new ImageFile("波波烤鴨.jpg");
videoFile = new VideoFile("aaa.mp4");
Folder f = new Folder("c:/tools");
f.add(videoFile);
f.add(imageFile);
f.add(textFile);
Folder f1 = new Folder("c:/");
f1.add(videoFile);
f1.add(videoFile);
f1.add(imageFile);
f1.add(f);
f1.operiation();
}
輸出:
處理:c:/檔案夾
視訊檔案:aaa.mp4 處理操作
視訊檔案:aaa.mp4 處理操作
圖檔檔案:波波烤鴨.jpg 處理操作
處理:c:/tools檔案夾
視訊檔案:aaa.mp4 處理操作
圖檔檔案:波波烤鴨.jpg 處理操作
文本檔案:readme.txt 處理操作
開發中的應用場景:
作業系統的資料總管
GUI中的容器層次圖
XML檔案解析
OA系統中,組織結構的處理
Junit單元測試架構
• 底層設計就是典型的組合模式,TestCase(葉子)、TestUnite(容器)、Test接口(抽象)