设计模式之组合模式

参考博文:https://www.cnblogs.com/jingmoxukong/p/4221087.html 侵权删除

2019-06-25  13:36:54

组合模式  Component

什么是组合模式:将对象组合成“树形”结构以表示“部分-整体”的层次结构。使得客户对单个对象或组合对象的使用具有一致性

适用性:需要对单个对象和对象组合提供一致性的操作。

组合模式成员:

  Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。

  Composite:定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。

  leaf:表示叶节点对象,叶子节点没有子节点()。

组合模式代码思考:

  需要对叶子节点和枝节点提供统一性的操作,故将叶子节点和枝节点抽象提供统一的接口。

  枝节点中的operation()方法:

    for(Component c : components){
        c.operation();
    }

  叶节点中的operation()方法:

    public void operation() {
        //相应操作
    }

组合模式基本代码:

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

/**
 * 将对象和对象组合抽象
 */
public interface Component {
    public void add(Component c);
    public void remove(Component c);
    public void operation();
}

/**
 * 枝节点
 * 对象组合,可以添加或删除对象
 * 
 */
class Composite implements Component{
    private String name;
    private List<Component> components;


    //List集合表示子结点容器
    public Composite(String name) {
        components = new ArrayList<>();
        this.name = name;
    }

    @Override
    public void add(Component c) {
        components.add(c);
    }

    @Override
    public void remove(Component c) {
        components.remove(c);
    }

    @Override
    public void operation() {
        for(Component c : components){
            c.operation();
        }
    }
}

/**
 * 叶子节点
 * 不能有添加节点或删除节点
 */
class Leaf implements Component{
    private String name;

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

    @Override
    public void operation() {
        System.out.println("leaf operation   " + name);
    }

    @Override
    public void add(Component c) {}

    @Override
    public void remove(Component c) {}
}

/**
 * 客户端
 * 测试代码
 *
 */
class Client{
    public static void main(String[] args) {
        Component root = new Composite("root");
        Component node1 = new Composite("node1");
        Component leaf1 = new Leaf("leaf1");
        Component leaf21 = new Leaf("leaf21");
        Component leaf22 = new Leaf("leaf22");

        root.add(node1);
        root.add(leaf1);
        node1.add(leaf21);
        node1.add(leaf22);

        root.operation();
        node1.operation();
        leaf1.operation();
    }
}

    /*
    输出结果:
    leaf operation   leaf21
    leaf operation   leaf22
    leaf operation   leaf1
    leaf operation   leaf21
    leaf operation   leaf22
    leaf operation   leaf1
     */

 

posted @ 2019-06-25 14:12  由走啦啦啦  阅读(107)  评论(0编辑  收藏  举报