设计模式之——组合设计模式

将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,组合模式让你可以优化处理递归或分级数据结构。

实例:目录结构、网站导航

Component

抽象的部件类描述将来所有部件共有的行为,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件

package com.zndroid.dm.CompositionModel;

/**
 * Created by luzhenyu on 2017/9/5.
 */

/**抽象的部件类描述将来所有部件共有的行为,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件*/
public abstract class Component {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void addComponent(Component component);
    public abstract void removeComponent(Component component);
    public abstract void eachComponent();
}

Composite

组合类 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作

package com.zndroid.dm.CompositionModel.impl;

/**
 * Created by luzhenyu on 2017/9/5.
 */

import com.zndroid.dm.CompositionModel.Component;

import java.util.ArrayList;
import java.util.List;

/**组合类 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作*/
public class Composite extends Component{

    private List<Component> list = new ArrayList<>();//用来存储组合的部件

    @Override
    public void addComponent(Component component) {
        list.add(component);
    }

    @Override
    public void removeComponent(Component component) {
        list.remove(component);
    }

    @Override
    public void eachComponent() {
        System.out.println(getName() + " was traversed");
        for (Component e: list) {
            e.eachComponent();
        }
    }
}

Leaf

叶子组件在组合中表示叶子结点对象,叶子结点没有子结点 不具有add remove属性

package com.zndroid.dm.CompositionModel.impl;

import com.zndroid.dm.CompositionModel.Component;

/**
 * Created by luzhenyu on 2017/9/5.
 */

/**叶子组件在组合中表示叶子结点对象,叶子结点没有子结点 不具有add remove属性*/
public class LeafComponent extends Component {

    //叶子节点不具备添加组件的能力,所以不实现
    @Override
    public void addComponent(Component component) {

    }

    //叶子节点不具备添加组件的能力,所以不实现
    @Override
    public void removeComponent(Component component) {

    }

    @Override
    public void eachComponent() {
        System.out.println(getName() + " was traversed");
    }
}
具体使用:

/**
         * 组合模式
         * 将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
         * 模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
         * 组合模式让你可以优化处理递归或分级数据结构
         * 实例:目录结构、网站导航
         * 优点:1、高层模块调用简单。 2、节点自由增加。
         * 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
         * */
        //结构类似:
        //根节点 |--
        //         根节点1 |--
        //                   叶子节点11
        //                   叶子节点12
        //         根节点2 |--
        //                   叶子节点21
        Component root1 = new Composite();
        root1.setName("根节点1");

        Component leaf11 = new LeafComponent();
        leaf11.setName("根节点1 - 叶子节点1");

        Component leaf12 = new LeafComponent();
        leaf12.setName("根节点1 - 叶子节点2");

        root1.addComponent(leaf11);
        root1.addComponent(leaf12);

        Component root2 = new Composite();
        root2.setName("根节点2");

        Component leaf21 = new LeafComponent();
        leaf21.setName("根节点2 - 叶子节点1");

        root2.addComponent(leaf21);

        Component root = new Composite();
        root.setName("根节点");
        root.addComponent(root1);
        root.addComponent(root2);

        root.eachComponent();
        log("----------------我是分割线-----------------");


【欢迎上码】

【微信公众号搜索 h2o2s2】


猜你喜欢

转载自blog.csdn.net/luzhenyuxfcy/article/details/77862489