组合模式【设计模式-结构型模式】

组合模式

定义

  组合模式又叫部分整体模式,它是一种对象组合成树状层次结构的模式,使用户对单个对象和组合对象具有一致的访问性,即访问单个对象和组合对象对于用户来说没有区别。

角色

  • 抽象构件角色:它的主要作用是为树叶构件和树枝构件声明公共的接口,并实现他们的默认行为(一些方法),它是抽象类。在透明式组合模式中,抽象构件还声明访问和管理子类对象的接口;在安全的组合模式中抽象构件不声明访问和管理子类对象的接口,其管理工作交给树枝构建完成
  • 树叶构件角色:组合模式中的叶子节点对象,它没有子节点,用于实现抽象构件角色中声明的公共接口
  • 树枝构件角色:是组合模式中的分支节点对象,它有子节点,实现了抽象构建角色中声明的公共接口,主要存储和管理子部件,通常包含Add()、Remove()、GetChild()方法。

案例实现

  打印菜单以及它的所有子菜单和子菜单项的名字
1.抽象构件

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

    public void add(MenuComponent menuComponent) {
        //
    }

    public void remove(MenuComponent menuComponent) {

    }

    public String getName() {
        return name;
    }
	//抽象方法,公共方法,被叶子和树枝构件实现
    public abstract void print();
}

2.树枝构件

public class Menu extends MenuComponent{
	//用于存储和管理子部件
    private List<MenuComponent> menus = new ArrayList<>();

    public Menu(String name,int level) {
        this.name = name;
        this.level = level;
    }

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

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

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

3.树叶构件

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);
    }
}

4.测试类

public class ClientTest {
    public static void main(String[] args) {
        MenuItem i1 = new MenuItem("页面访问",3);
        MenuItem i2 = new MenuItem("展开菜单",3);
        MenuItem i3 = new MenuItem("编辑菜单",3);
        MenuItem i4 = new MenuItem("删除菜单",3);
        MenuComponent menu = new Menu("菜单管理",2);
        menu.add(i1);
        menu.add(i2);
        menu.add(i3);
        menu.add(i4);
//        menu.print();
        //
        MenuItem k1 = new MenuItem("页面访问",3);
        MenuItem k2 = new MenuItem("提交保存",3);
        Menu  menu1= new Menu("权限配置", 2);
        menu1.add(k1);
        menu1.add(k2);
        //
        MenuItem j1 = new MenuItem("页面访问",3);
        MenuItem j2 = new MenuItem("新增角色",3);
        MenuItem j3 = new MenuItem("修改角色", 3);
        Menu menu2 = new Menu("角色管理", 2);
        //总的
        Menu menu3 = new Menu("系统管理", 1);
        menu3.add(menu);
        menu3.add(menu1);
        menu3.add(menu2);
        menu3.print();

    }
}

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值