23种设计模式-java

composite pattern(组合模式)

2018-06-08  本文已影响12人  oneWeekOneTopic

解决问题

它可以将局部和整体无差异化处理。

应用场景

对于一个问题,如果每个局部都有类似的处理方式,那么我们就可以将其整合成一个整体,统一处理,避免局部处理的复杂化。

它有一个要求是:面对的问题整体应该可以用树形结构表示,而每个局部即为子结点。

比如:前端所面临的container和组件的关系

公司和部门的关系

文件夹和文件的关系

语法树和node的关系

模式图(UML)

image
image

类图一般由以上两种表示方式,但我更倾向于第一种,因为第二种具有很大的操作风险,但第二种才可以让操作者对局部和整体无任何感知。

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

上一篇下一篇

猜你喜欢

热点阅读