解決問題
它可以將區域性和整體無差異化處理。
應用場景
對於一個問題,如果每個區域性都有類似的處理方式,那麼我們就可以將其整合成一個整體,統一處理,避免區域性處理的複雜化。
它有一個要求是:面對的問題整體應該可以用樹形結構表示,而每個區域性即為子結點。
比如:前端所面臨的container和元件的關係
公司和部門的關係
資料夾和檔案的關係
語法樹和node的關係
模式圖(UML)
類圖一般由以上兩種表示方式,但我更傾向於第一種,因為第二種具有很大的操作風險,但第二種才可以讓操作者對區域性和整體無任何感知。
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