composite pattern(组合模式)

解决问题

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

应用场景

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

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

比如:前端所面临的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值