设计模式学习笔记二十四:优雅的菜单

介绍

组合(COMPOSITE)模式 属于对象结构型模式。将对象组合成树结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。(摘自《GoF设计模式》)

个人见解

我能想到的就是树形菜单的应用,层次关系,只有树形了。。。

UML结构图

COMPOSITE

场景模拟

菜单结构的一种优雅设计

代码实现

1.统一组件访问接口,即Component:

public interface Component {
    public void add(Component component);
    public void remove(Component component);
    public void read();
}

2.单个组件的实现,即Leaf:

public class SingleComponent implements Component{
    private String level;
    public SingleComponent(String level) {
        this.level = level;
    }

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException("Not yet allowed...");
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException("Not yet allowed...");
    }

    @Override
    public void read() {
        System.out.println(level);
    }
}

3.组合类组件实现,即Composite:

public class CompositeComponent implements Component{

    private Set<Component> menus = new HashSet<Component>();

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

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

    @Override
    public void read() {
        for (Component menu : menus) {
            menu.read();
        }
    }
}

4.调用,即Client:

public class Run {
    public static void main(String[] args) {
        // 来个根节点,传说中的组合类
        Component root = new CompositeComponent();

        // 子节点,传说中的单个组件
        Component sub_1 = new SingleComponent("sub_1");
        Component sub_2 = new SingleComponent("sub_2");
        Component sub_3 = new SingleComponent("sub_3");

        Component sub_4 = new CompositeComponent();
        Component sub_4_1 = new SingleComponent("sub_4_1");
        Component sub_4_2 = new SingleComponent("sub_4_2");

        // 添加子节点的子节点菜单
        sub_4.add(sub_4_1);
        sub_4.add(sub_4_2);

        // 为根节点添加子节点
        root.add(sub_1);
        root.add(sub_2);
        root.add(sub_3);
        root.add(sub_4);

        // 读取节点
        root.read();
    }
}
原文地址:https://www.cnblogs.com/liushijie/p/4808972.html