composite pattern(组合模式)

解决问题

它能够将局部和总体无差别化处理。前端

应用场景

对于一个问题,若是每一个局部都有相似的处理方式,那么咱们就能够将其整合成一个总体,统一处理,避免局部处理的复杂化。node

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

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

公司和部门的关系code

文件夹和文件的关系component

语法树和node的关系cdn

模式图(UML)

类图通常由以上两种表示方式,但我更倾向于第一种,由于第二种具备很大的操做风险,但第二种才能够让操做者对局部和总体无任何感知。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

相关文章
相关标签/搜索