组合模式-完美处理树形递归结构

组合模式定义

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

组合模式结构图

组合模式-完美处理树形递归结构_第1张图片

组合模式角色介绍

抽象构件角色,Component,一个普通业务构件,它可以是接口或抽象类,为叶子构件和容器构件对象声明接口。

叶子构件角色,Leaf,它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。

容器构件角色,Composite,它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。

组合模式结构代码

抽象构件:

public interface Component {

    void operation();

    //向容器中添加构件
    void add(Component component);

    //从容器中删除构件
    void remove(Component component);

    //获取容器中的构件
    void getChild(int i);

}

叶子构件:

public class Leaf implements Component {

    public void operation() {
        System.out.println("i am leaf");
    }

    public void add(Component component) {
        throw new RuntimeException("leaf do not support add");
    }

    public void remove(Component component) {
        throw new RuntimeException("leaf do not support remove");

    }

    public void getChild(int i) {
        throw new RuntimeException("leaf do not support getChild");

    }
}

容器构件:

public class Composite implements Component {

    private List componentList;

    public Composite() {
        this.componentList = new ArrayList();
    }

    //循环遍历容器内容所有构件,并对其进行操作
    public void operation() {
        for (Component c:componentList) {
            c.operation();
        }
    }

    public void add(Component component) {
        componentList.add(component);
    }

    public void remove(Component component) {
        componentList.remove(component);
    }

    public void getChild(int i) {
        componentList.get(i);
    }
}

客户端:

public class Client {
    public static void main(String[] args) {

        Component leaf = new Leaf();
        //操作叶子
        leaf.operation();


        Component composite = new Composite();
        composite.add(leaf);
        //操作容器
        composite.operation();

    }
}

组合模式运行机制

无论是叶子还是容器,都实现共同的组件接口;客户端面向组件接口编程,这样客户端在操作组件时就避免了叶子与容器的差异性;
叶子和容器的差异性,由各自内部实现体现,比如叶子实现操作容器的方法都是抛出异常的方式,容器实现业务逻辑operation方法时,通过遍历容器,把请求继续传递给容器内部的子构件。

组合模式解决的核心问题

组合模式让客户端可以无差异性的处理叶子和容器节点,完美处理树形递归结构。

你可能感兴趣的:(设计模式,设计模式学习之旅)