Java設計模式學習08——組合模式
阿新 • • 發佈:2019-01-01
一、組合模式適用場景
把部分和整體的關係用樹形結構來表示,從而使客戶端可以使用統一的方式對部分物件和整體物件進行管理。
二、組合模式結構
- 抽象構件(Conponent)角色:所有類的共有介面,定義了葉子和容器的共同點。
- 葉子(Leaf)構件角色:在組合中表示葉子結點物件,葉子節點無子節點。
- 容器(Composite)構件角色:有容器特徵,可以 用來儲存子節點,在Component介面中實現與子節點有關操作,如增加(add)和刪除 (remove)等。
組合模式工作流程分析
- 組合模式為處理樹形結構提供了完美的解決方案,描述瞭如何將容器和葉子進行遞迴組合,使得使用者在使用時可以一致性的對待容器和葉子。
- 當容器物件的指定方法被呼叫時,將遍歷整個樹形結構,尋找包含這個方法的成員,並呼叫執行。其中,使用遞迴呼叫機制對整個結構進行處理。
下面通過簡單的防毒例子,使用組合模式:
示例程式碼:
1.抽象構件
public interface AbstractFile {
void killVirus();//防毒
}
2. 葉子構件
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+"防毒");
}
}
3. 容器構件
class Folder implements AbstractFile{
private String name;
private ArrayList<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();
}
}
}
4.客戶端
public class Client {
public static void main(String[] args) {
Folder f1;
AbstractFile f2,f3;
f1=new Folder("我的收藏");
f2=new ImageFile("my.jpg");
f3=new TextFile("my.txt");
f1.add(f2);
f1.add(f3);
f1.killVirus();
}
}
//輸出結果:
---對資料夾我的收藏防毒
---對影象檔案my.jpg防毒
---對文字檔案my.txt防毒