前言:
組合模式可以看做是文件系統,文件夾和文件都是一種存貯方式,文件又分爲圖像、文本、視頻等文件,文件夾下有包含有其他的文件或者文件夾
他們每一個都是一個節點,因此客戶端可以使用統一的方式來進行處理。文件夾下包含着一個集合用於存儲它的子節點
把部分和整體的關係使用樹形結構來表示,從而使客戶端可以使用統一的方式
處理部分的對象和整體對象
組合模式核心 :
抽象構件(Component)角色:定義了葉子和容器構件的共同點
葉子(Leaf) 構件角色:無子節點
容器(Composite)構件角色:有容器特徵,可以包含子節點
一、代碼實現
package Composite;
import java.util.ArrayList;
import java.util.List;
//相當於基本的節點
public interface AbstractFile {
void killVIrus();
}
//不同的文件類型
class ImageFile implements AbstractFile
{ private String name;
public ImageFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自動生成的方法存根
System.out.println("對圖像文件"+name+"進行查殺");
}
}
class TextFile implements AbstractFile
{ private String name;
public TextFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自動生成的方法存根
System.out.println("對文本文件"+name+"進行查殺");
}
}
class VideoFile implements AbstractFile
{ private String name;
public VideoFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自動生成的方法存根
System.out.println("對視屏文件"+name+"進行查殺");
}
}
//文件夾,同樣也是節點
class Folder implements AbstractFile
{ private String name;
public Folder(String name) {
super();
this.name = name;
}
//有一個集合包含着它的子節點
List<AbstractFile> list=new ArrayList<AbstractFile>();
public void add(AbstractFile abstractFile)
{
list.add(abstractFile);
// System.out.println("成功將文件添加!");
}
public void remove(AbstractFile abstractFile)
{
list.add(abstractFile);
// System.out.println("成功將文件刪除!");
}
public AbstractFile get(Integer index)
{
return list.get(index);
}
@Override
//遞歸遍歷
public void killVIrus() {
// TODO 自動生成的方法存根
System.out.println("對文件夾"+name+"進行查殺");
for (AbstractFile abstractFile : list) {
abstractFile.killVIrus();
}
}
}
調用:
package Composite;
public class Client {
public static void main(String[] args) {
AbstractFile f2,f3,f4,f5;
Folder folder,folder2;
f2=new ImageFile("揚哥哥的大頭照.jpg");
f3=new TextFile("日誌.txt");
folder=new Folder("我的收藏");
folder2=new Folder("我的收藏子文件");
folder.add(f2);
folder.add(f3);
folder.add(folder2);
folder.killVIrus();
}
}
實現結果:
二、應用場景
操作系統的資源管理器
GUI中的容器層次圖
XML文件解析
OA系統中組織結構處理
Junit單元測試框架
底層設計就是組合模式,TestCase(葉子) TestUnite(容器) Test接口