设计模式—组合模式

简介

组合模式也成为部分整体模式,它将一组相似的对象看作一个对象来处理,并根据一个树状结构来组合对象,然后提供统一的方法去访问相应的对象

定义

将对象表示成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

使用场景

表示对象的部分、整体层次结构时

从一个整体中能够独立出部分模块或功能的场景

关键点

一个抽象根节点—声明组合对象的接口,在适当情况下实现所有类共有接口的缺省行为

一个枝干节点角色—继承于根节点,定义与叶子节点有关的枝干行为

一个叶子节点—继承于根节点,实现具体逻辑

实现

/**
 * 抽象根节点
 */
public abstract class AbsComponent {

    protected String name;

    public AbsComponent(String name) {
        this.name = name;
    }

    /**
     * 具体节点行为
     */
    public abstract void doSomething();
}
/**
 * 枝干节点
 */
public class Composite extends AbsComponent {

    /**
     * 存储节点的容器
     */
    private List<AbsComponent> components = new ArrayList<>();

    public Composite(String name) {
        super(name);
    }

    /**
     * 枝干节点的具体行为
     */
    @Override
    public void doSomething() {
        if (!components.isEmpty()) {
            for (AbsComponent component : components) {
                component.doSomething();
            }
        }
    }

    /**
     * 添加节点
     */
    public void addChild(AbsComponent component) {
        components.add(component);
    }

    /**
     * 移除节点
     */
    public void removeChild(int index) {
        components.remove(index);
    }
}
/**
 * 叶子节点
 */
public class Leaf extends AbsComponent {

    public Leaf(String name) {
        super(name);
    }

    @Override
    public void doSomething() {
        Log.i(getClass().getSimpleName(), "叶子节点" + name);
    }
}

使用

//构造一个根节点
Composite root = new Composite("根节点");
//构造两个枝干节点
Composite branch1 = new Composite("1号枝干");
Composite branch2 = new Composite("2号枝干");

//构造两个叶子几点
Leaf leaf1 = new Leaf("1号叶子");
Leaf leaf2 = new Leaf("2号叶子");

//将叶子组合到枝干
branch1.addChild(leaf1);
branch2.addChild(leaf2);

//将枝干组合到根节点
root.addChild(branch1);
root.addChild(branch2);

root.doSomething();

小结

优点

清楚的定义分层次的复杂对象,表示对象的全部层次或部分层次,使得高层模块忽略低层模块的差异,方便对整个层次进行控制

高层模块可以一致的使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了高层模块的代码

添加新的枝干结构和叶子结构都非常方便,符合开闭原则,扩展性极高

缺点

在新增节点时不好对枝干中的节点类型进行限制,因为高层模块和低层模块依赖相同的抽象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值