composite pattern(組合模式)

fulton發表於2019-01-28

解決問題

它可以將區域性和整體無差異化處理。

應用場景

對於一個問題,如果每個區域性都有類似的處理方式,那麼我們就可以將其整合成一個整體,統一處理,避免區域性處理的複雜化。

它有一個要求是:面對的問題整體應該可以用樹形結構表示,而每個區域性即為子結點。

比如:前端所面臨的container和元件的關係

公司和部門的關係

資料夾和檔案的關係

語法樹和node的關係

模式圖(UML)

composite pattern(組合模式)
composite pattern(組合模式)

類圖一般由以上兩種表示方式,但我更傾向於第一種,因為第二種具有很大的操作風險,但第二種才可以讓操作者對區域性和整體無任何感知。

Component:表示元件,它只定義整體和區域性相同的操作operation

Leaf:只需要繼承Component,它代表了最小單元,不能有其它的差異化行為,否則會產生風險

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

相關文章