设计模式 组合模式

概述


结构

案例

代码实现

编写一个抽象类 包含菜单和菜单项通用的接口

public abstract class MenuComponent {
    protected String name;
    protected int level;

    public void add(MenuComponent menuComponent){
        throw new UnsupportedOperationException();
    }

    public void remove(MenuComponent menuComponent){
        throw new UnsupportedOperationException();
    }

    public MenuComponent  getChild(int i){
        throw new UnsupportedOperationException();
    }

    public String getName(){
        return this.name;
    }

    public void print(){
        throw new UnsupportedOperationException();
    }
}

编写菜单类 实现接口

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

public class Menu extends MenuComponent{
    private List<MenuComponent> menuComponentList;

    public Menu(String name,int level){
        this.name = name;
        this.level = level;
        menuComponentList = new ArrayList<>();
    }


    @Override
    public void add(MenuComponent menuComponent) {
        menuComponentList.add(menuComponent);
    }

    @Override
    public void remove(MenuComponent menuComponent) {
        menuComponentList.remove(menuComponent);
    }

    @Override
    public MenuComponent getChild(int i) {
        return menuComponentList.get(i);
    }

    @Override
    public void print() {
        for (int i = 0; i < level; i++) {
            System.out.print("---");
        }
        System.out.println(name);
        for(MenuComponent menuComponent : menuComponentList){
            menuComponent.print();
        }
    }
}

编写菜单项 实现接口

public class MenuItem extends MenuComponent{
    public MenuItem(String name,int level) {
        this.name = name;
        this.level = level;
    }

    @Override
    public void print() {
        for (int i = 0; i < level; i++) {
            System.out.print("---");
        }
        System.out.println(name);
    }
}

测试使用:

public class Test {
    public static void main(String[] args) {
        MenuComponent menu1 = new Menu("菜单管理",2);
        MenuComponent menu2 = new Menu("权限配置",2);

        menu1.add(new MenuItem("页面访问",3));
        menu1.add(new MenuItem("展开菜单",3));
        menu1.add(new MenuItem("编辑菜单",3));

        menu2.add(new MenuItem("页面访问",3));
        menu2.add(new MenuItem("提交保存",3));

        MenuComponent menu = new Menu("系统菜单",1);
        menu.add(menu1);
        menu.add(menu2);
        menu.print();
    }
}

可以看到组合模式的核心思想就是将两个类 看成同一个类来操作

组合模式的分类

总结

posted @ 2021-10-11 20:55  一个经常掉线的人  阅读(33)  评论(0)    收藏  举报