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


    介绍

    组合(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();
        }
    }
    
  • 相关阅读:
    混合开发的坑(3) ---关于es6
    混合开发的坑(2) ---pdf展示
    混合开发的坑(1) ---ajax请求
    vue.js
    vue中 import引入组件
    vue中 静态文件引用注意事项
    Oracle 数据库链接
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    Merge into 使用
    C# —— IList, ArrayList与List的区别详解
  • 原文地址:https://www.cnblogs.com/liushijie/p/4808972.html
Copyright © 2020-2023  润新知