组合模式

一句话定义

又叫部分整体模式,将树形结构的每一个节点作为对象,组合成为整个树形结构。

使用场景

树形结构,分层分组的情况。
各个元素节点具有类似的属性。

实现要点

1.所有的节点实现同一个接口,内部并组合该接口
2.安全的组合模式元素抽象只包含简单共同结构,根、叶具体逻辑自己实现
3.透明的组合模式元素抽象结构完全一致,根、叶在内部判断子节点类型

情景假设

实现一个简单树型结构。
这里使用透明的组合模式。

实现步骤

1.创建抽象元素节点
/**
 * 组合模式 抽象元素节点
 *
 * @author fengzhen
 * @version 1.0, 2017/5/22
 */
public abstract class Component {
    protected String name;

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

    /**
     * 添加子节点
     *
     * @author fengzhen
     * @version 1.0, 2017/5/22 14:29
     */
    public abstract boolean addChild(Component child);

    /**
     * 删除子节点
     *
     * @author fengzhen
     * @version 1.0, 2017/5/22 14:29
     */
    public abstract boolean removeChild(Component child);

    /**
     * 获取子节点
     *
     * @author fengzhen
     * @version 1.0, 2017/5/22 14:29
     */
    public abstract Component getChild(int index);

    /**
     * 节点完成事件
     *
     * @author fengzhen
     * @version 1.0, 2017/5/22 14:29
     */
    public abstract void execute();

}
2.创建具体的根节点
/**
 * 根和枝干节点的具体实现
 *
 * @author fengzhen
 * @version 1.0, 2017/5/22
 */
public class Truck extends Component{
    // 存储子节点集合
    private List<Component> components = new ArrayList<>();

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

    @Override
    public boolean addChild(Component child) {
        components.add(child);
        return true;
    }

    @Override
    public boolean removeChild(Component child) {
        components.remove(child);
        return true;
    }

    @Override
    public Component getChild(int index) {
        return components.get(index);
    }

    @Override
    public void execute() {
        Log.i("info", "execute: ==" + name);
    }
}
3.创建具体的页节点
/**
 * 叶子节点具体实现
 *
 * @author fengzhen
 * @version 1.0, 2017/5/22
 */
public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }

    @Override
    public boolean addChild(Component child) {
        return false;
    }

    @Override
    public boolean removeChild(Component child) {
        return false;
    }

    @Override
    public Component getChild(int index) {
        return null;
    }

    @Override
    public void execute() {
        Log.i("info", "execute: == 执行叶子节点" + name);
    }
}
4.创建树形结构
   // 组合模式
   // 根节点
   Component root = new Truck("root");
   // 为根节点创建并添加子节点
   Truck truck1 = new Truck("truck1");
   Leaf leaf1 = new Leaf("leaf1");
   root.addChild(truck1);
   root.addChild(leaf1);
   // 为树干节点创建添加子节点
   Leaf leaf2 = new Leaf("leaf2");
   truck1.addChild(leaf2);
也可以添加前驱节点属性,类似文件夹用于返回上层。Android中View和ViewGroup就使用了组合模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值