composite pattern(組合模式)

解決問題

它能夠將局部和總體無差別化處理。前端

應用場景

對於一個問題,若是每一個局部都有相似的處理方式,那麼咱們就能夠將其整合成一個總體,統一處理,避免局部處理的複雜化。node

它有一個要求是:面對的問題總體應該能夠用樹形結構表示,而每一個局部即爲子結點。bash

好比:前端所面臨的container和組件的關係spa

公司和部門的關係code

文件夾和文件的關係component

語法樹和node的關係cdn

模式圖(UML)

類圖通常由以上兩種表示方式,但我更傾向於第一種,由於第二種具備很大的操做風險,但第二種才能夠讓操做者對局部和總體無任何感知。blog

Component:表示組件,它只定義總體和局部相同的操做operation繼承

Leaf:只須要繼承Component,它表明了最小單元,不能有其它的差別化行爲,不然會產生風險ip

Comosite:即組合,它表明的是對Leaf的組合

示例

假設一個樂隊進行表演,樂隊有不一樣的成員,但他們各有各的表演方式,假設有兩個歌手,一個鋼琴手(更多 就不列舉了)。

component

public interface Player { 
    public void play(); 
}
複製代碼

Leaf

public class Pianist implements Player { 
    public void play() { 
        System.out.println("play the piano"); 
    } 
}
public class Singer implements Player { 
    public void play() { 
        System.out.println("sing a segment of a song"); 
    } 
}
複製代碼

composite

public class Band implements Player { 
    private List<Player> playerList = Lists.newArrayList(); 
 
    public void play() { 
        for (Player player : playerList) { 
            player.play(); 
        } 
    } 
 
    public void add(Player player) { 
        playerList.add(player); 
    } 
 
    public static void main(String[] args) { 
        Band band = new Band(); 
        band.add(new Singer()); 
        band.add(new Singer()); 
        band.add(new Pianist()); 
        band.play(); 
    } 
}
複製代碼

參考 https://en.wikipedia.org/wiki/Composite_pattern

相關文章
相關標籤/搜索