十八、组合设计模式

1. 组合设计模式介绍

组合设计模式在日常生活中比较常见,在数据结构中就是我们的树结构。
常见的有:
1. 多级树形菜单
2. 文件和文件夹目录

定义

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

2. 组合设计模式使用场景

  • 表示对象的部分-整体层次结构时。
  • 从一个整体中能够独立出部分模版或功能的场景。

3. 组合设计模式UML类

组合设计模式

角色介绍

  • Component: 抽象根节点,为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。

  • Composite:定义有子结点的那些枝干节点的行为,存储子结点,在Component接口中实现与子结点有关的操作。

  • Leaf: 在组合中表示叶子节点对象,叶子节点没有子结点,在组合中定义节点对象的行为。

  • Client:通过Component接口操纵组合节点的对象。

4. 组合设计模式简单实现

  • (1)、首先定义一个抽象根节点:
public abstract class Component {
    protected String name;

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

    /**
     * 具体的逻辑方法由子类实现
     */
    public abstract void doSomething();

}

抽象根节点里面主要有一个抽象方法doSomething()。具体的方法由子类去实现。

  • (2)、接着定义具体枝干节点:
public class Compsite extends Component {
    private List<Component> components = new ArrayList<>();

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

    @Override
    public void doSomething() {
        System.out.println(name);

        if (null != components) {
            for (Component component : components) {
                component.doSomething();
            }
        }
    }

    /**
     * 添加子节点
     *
     * @param child
     */
    public void addChild(Component child) {
        components.add(child);
    }

    /**
     * 移除子结点
     *
     * @param child
     */
    public void removeChild(Component child) {
        components.remove(child);
    }

    /**
     * 获取子结点对应下标
     * @param index
     * @return
     */
    public Component getChildren(int index) {
        return components.get(index);
    }
}

在具体的枝干节点里面,有一个存储节点的容器,用来存储子结点,在doSomething()方法里面,首先打印出当前节点的名称,接着遍历所有的子结点,调用其doSomething方法。

同时里面还有操作子结点集合的增删改查方法。

  • (3)、接着我们来定义具体的叶子节点
public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }

    @Override
    public void doSomething() {
        System.out.println(name);
    }
}

叶子节点里面没有存储子结点的容器,当然也没有对子结点容器的增删改查方法。在doSomething方法里面直接打印出了当前叶子节点的名称。

  • (4)、测试客户端
public class Client {
    public static void main(String[] args) {
        //构造一个根节点
        Compsite root = new Compsite("Root");

        //构造两个枝干节点
        Compsite branch1 = new Compsite("Branch1");
        Compsite branch2 = new Compsite("Branch2");

        //构造两个叶子节点
        Leaf leaf1 = new Leaf("Leaf1");
        Leaf leaf2 = new Leaf("Leaf2");

//        将两个叶子添加至枝干节点中
        branch1.addChild(leaf1);
        branch2.addChild(leaf2);

        //将枝干节点添加至根节点中
        root.addChild(branch1);
        root.addChild(branch2);

        root.doSomething();
    }
}

5. 组合设计模式在Android源码

在Android源码中,一个典型的例子就是View和ViewGroup的嵌套组合。

View和ViewGroup

在上述所展示的视图层级树种,视图控件TextView、Buttong等继承自View,ViewGroup容器也继承自View。ViewGroup同时也包含其他View。但是TextView等视图控件不能包含其它控件。

ViewGroup相对于View多了对视图操作的方法。类似于上面枝干节点叶子节点多了子结点操作的方法。

为什么ViewGroup比View多了视图操作等方法?

因为ViewGroup实现了ViewParent和ViewManager接口上,ViewManager接口定义了addView,removeView等对子视图操作的方法。

由于我们的重点是View和ViewGroup组合模式的了解,这里对里面的详细细节做过多的分析 ,同上面的继承关系就能看出它们之间的组合关系。

6. 总结

组合设计模式在Android开发中并不多见,我们这里做了解。

  • 优点:
    • 组合模式解耦了客户端与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值