设计模式 之组合模式

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

前言

前面那期我们讲了桥接模式,桥接模式通过组合的形式将两个不同类型的东西连接在了一起,使他们能够互相联系,而本期讲解的组合模式,他虽然叫组合模式,但是用法跟我的组合方式不同,组合指的是一个类引用了另一个类,而组合模式是引用子容器,子容器继续引用子容器依次类推。

image.png

组合模式

组合模式正如上方图片的树一样,它我个人认为专门解决这种套娃问题十分好用,比如什么人口普查城市一层套一层,一直到个人,还有就是大袋子装小袋子,小袋子装更小袋子,树有树枝,树枝又有树叶,是不是感觉有点递归的感觉,没错就是。

一般看到树形结构你只要能联想到组合模式就行,联想到后根据实际应用场景来决定是否采用组合模式进行开发,比如在做权限认证时,权限是属性结构,那处理权限校验这个人是否有这个权限就可以使用组合模式,或者部门组织架构如果需要查询某个人是否在该部门同样的可以使用组合模式。

组合模式的实现代码

这里我们重点查看这段代码,

public class Composite{

    /**
     * 以树形结构方式展示组件名字,递归调用
     */
    @Override
    public void display(String str) {
        // 最上层根节点的名称
        System.out.println(str + "+" + this.getName());
        // 这里是个递归
        if (null != childComponents) {
  
            str += "->";
            //这里的循环就是组合中的递归,重点就是,这个会遍历子容器一直到底返回
            for (Component component : childComponents) {
                // 递归打印每个子组件名称
                component.display(str);
            }
        }
    }