它能夠將局部和總體無差別化處理。前端
對於一個問題,若是每一個局部都有相似的處理方式,那麼咱們就能夠將其整合成一個總體,統一處理,避免局部處理的複雜化。node
它有一個要求是:面對的問題總體應該能夠用樹形結構表示,而每一個局部即爲子結點。bash
好比:前端所面臨的container和組件的關係spa
公司和部門的關係code
文件夾和文件的關係component
語法樹和node的關係cdn
類圖通常由以上兩種表示方式,但我更傾向於第一種,由於第二種具備很大的操做風險,但第二種才能夠讓操做者對局部和總體無任何感知。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