zoukankan      html  css  js  c++  java
  • 设计模式学习笔记二十四:优雅的菜单

    介绍

    组合(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();
        }
    }
    
  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/liushijie/p/4808972.html
Copyright © 2011-2022 走看看