8、組合模式(設(shè)計模式筆記)

一、使用組合模式的場景

把部分和整體的關(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(接口)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 商品類別樹## 考慮這樣一個實際的應(yīng)用:管理商品類別樹。 在實現(xiàn)跟商品有關(guān)的應(yīng)用系統(tǒng)的時候...
    七寸知架構(gòu)閱讀 6,295評論 10 59
  • 繼承是is-a的關(guān)系。組合和聚合有點像,有些書上沒有作區(qū)分,都稱之為has-a,有些書上對其進行了較為嚴格區(qū)分,組...
    時待吾閱讀 505評論 0 1
  • 組合多個對象形成樹形結(jié)構(gòu)以表示具有“整體—部分”關(guān)系的層次結(jié)構(gòu)。組合模式對單個對象(即葉子對象)和組合對象(即容器...
    lyu571閱讀 554評論 0 1
  • 介紹 這篇主要講述設(shè)計模式中的組合模式。組合模式又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象。組合模...
    東西的南北閱讀 366評論 0 1
  • 對應(yīng)關(guān)系: 每個Thread對應(yīng)一個Looper 每個Looper對應(yīng)一個MessageQueue 每個Messa...
    小魚愛記錄閱讀 2,103評論 0 4

友情鏈接更多精彩內(nèi)容