一、使用組合模式的場景
把部分和整體的關(guān)系用樹形結(jié)構(gòu)來表示,從而使客戶端可以用統(tǒng)一的方式處理部分對象和整體對象
二、組合模式的核心
- 抽象構(gòu)件(
Component)角色:定義了葉子和容器構(gòu)件的共同點 - 葉子(
Leaf)構(gòu)件角色:無子節(jié)點 - 容器(
Composite)構(gòu)件角色:有容器特征,可以包含子節(jié)點
三、組合模式工作流程分析
組合模式為處理樹形結(jié)構(gòu)提供了完善的解決方案,描述了如何將容器和葉子進行遞歸組合,使得用戶在使用時可以一致性的對待容器和葉子。
當容器對象的指定方法被調(diào)用時,將遍歷整個樹形結(jié)構(gòu),尋找也包含這個方法的成員,并調(diào)用執(zhí)行。其中,使用了遞歸調(diào)用的機制對整個結(jié)構(gòu)進行處理。
四、使用組合模式,模擬殺毒軟件架構(gòu)設(shè)計:實例
組合模式的一般結(jié)構(gòu):
Component.java
package cn.itcast.day239.composite;
//抽象構(gòu)件
public interface Component {
public void operation();
}
//葉子組件
interface Leaf extends Component{
}
//容器組件
interface Composite extends Component{
public void add(Component c);
public void remove(Component c);
public Component getChild(int index);
}
實例:
AbstractFile.java
package cn.itcast.day239.composite;
import java.util.ArrayList;
import java.util.List;
//抽象構(gòu)件
public interface AbstractFile {
public void killVirus();//殺毒
}
//下面三個構(gòu)件相當于葉子(Leaf)
class ImageFile implements AbstractFile{
private String name;
public ImageFile(String name) {
this.name = name;
}
public void killVirus() {
System.out.println("圖像文件:" + name + ",進行查殺");
}
}
class TextFile implements AbstractFile{
private String name;
public TextFile(String name) {
this.name = name;
}
public void killVirus() {
System.out.println("文本文件:" + name + ",進行查殺");
}
}
class VideoFile implements AbstractFile{
private String name;
public VideoFile(String name) {
this.name = name;
}
public void killVirus() {
System.out.println("視頻文件:" + name + ",進行查殺");
}
}
//文件夾(相當于容器組件)
class Folder implements AbstractFile{
private String name;//文件夾名字
private List<AbstractFile> list = new ArrayList<AbstractFile>();//用來保存容器中的文件(葉子)
public Folder(String name) {
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);
}
public void killVirus() {
System.out.println("文件夾:" + name + ",進行查殺");
for(AbstractFile file : list){
file.killVirus();//天然有遞歸
}
}
}
說明:在文件夾(容器)的殺毒方法中天然的含有遞歸。
Client.java
package cn.itcast.day239.composite;
public class Client {
public static void main(String[] args) {
Folder f1 = new Folder("我的收藏");
AbstractFile f2, f3, f4, f5, f6;
f2 = new ImageFile("老高的頭像.jpg");
f3 = new TextFile("Hello.txt");
f1.add(f2);
f1.add(f3);
Folder f11 = new Folder("電影");
f4 = new VideoFile("笑傲江湖.avi");
f5 = new VideoFile("神雕俠侶.avi");
f11.add(f4);
f11.add(f5);
f1.add(f11);
f1.killVirus();
}
}
五、開發(fā)中的應(yīng)用場景
- 操作系統(tǒng)的資源管理器
-
GUI中的容器層次圖 -
XML文件解析 -
OA系統(tǒng)中組織結(jié)構(gòu)的處理 -
Junit單元測試框架:底層設(shè)計就是典型的組合模式,TestCast(葉子)、TestUnite(容器)、Test(接口)