composite pattern(组合模式)
2018-06-08 本文已影响12人
oneWeekOneTopic
解决问题
它可以将局部和整体无差异化处理。
应用场景
对于一个问题,如果每个局部都有类似的处理方式,那么我们就可以将其整合成一个整体,统一处理,避免局部处理的复杂化。
它有一个要求是:面对的问题整体应该可以用树形结构表示,而每个局部即为子结点。
比如:前端所面临的container和组件的关系
公司和部门的关系
文件夹和文件的关系
语法树和node的关系
模式图(UML)
imageimage
类图一般由以上两种表示方式,但我更倾向于第一种,因为第二种具有很大的操作风险,但第二种才可以让操作者对局部和整体无任何感知。
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();
}
}