组合模式(透明组合模式)

目录

1.核心本质

2.组成部分

3.优点

4.代码结构图

5.代码

5.1 组件

5.2 复合对象

5.3 叶子

5.4 客户端

5.5 运行结果

6.分类

6.1 透明组合模式

6.2 安全组合模式


1.核心本质

通过树形结构的组织方式,让我们可以采用统一的方式管理整体或部分,处理层次结构数据和对象组合时特别有用

2.组成部分

组件(Component): 定义组合中所有对象的通用接口,可以是抽象类或者接口。它声明了在组合中管理子组件的方法,如添加、移除和获取子组件。

叶子(Leaf): 表示组合中的叶子节点对象,它没有子节点。实现了组件接口的方法,但对于添加子节点等操作可能不实现(视具体需求而定)。

复合对象(Composite): 表示容器节点,它包含子节点。复合对象实现了组件接口,并且通常会存储子组件,实现组件接口中的操作方法。

3.优点

1.虽然内部复杂,但是客户端使用很简单。

2.可以一致的使用一个组合结构或者单个对象。

3.新增和删除叶子节点很方便。

4.通过叶子节点和符合对象的递归组合,形成树形结构,但是对结构控制很简单。

4.代码结构图

5.代码

5.1 组件

/**
 * 组件
 */
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 void getChild(int index) {
         throw new UnsupportedOperationException();
    }

    public String getName(){
        return name;
    }

    public abstract void print();
}

5.2 复合对象

/**
 * 复合对象
 */
public class Menu extends MenuComponent{
    private List<MenuComponent> menuComponents = new ArrayList<>();

    public Menu(String name,int level){
        this.name =name;
        this.level=level;
    }
    @Override
    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

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

    @Override
    public void getChild(int index) {
        menuComponents.get(index);
    }

    @Override
    public void print() {
        //打印菜单名词
        System.out.println(name);
        //打印子菜单名称
        for (MenuComponent menuComponent : menuComponents) {
            menuComponent.print();
        }
    }
}

5.3 叶子

/**
 * 叶子
 */
public class MenuItem extends MenuComponent{

    public MenuItem(String name, int level) {

        this.name = name;
        this.level = level;
    }
    @Override
    public void print() {
        System.out.println(name);
    }
}

5.4 客户端

public class Client {
    public static void main(String[] args) {
        MenuComponent menuComponent =  new Menu("系统管理",1);

        Menu people = new Menu("  人员管理", 2);
        MenuItem peopleAdd = new MenuItem("        人员添加", 3);
        MenuItem peopleRemove = new MenuItem("        人员删除", 3);
        Menu admin = new Menu("        管理员菜单", 3);
        MenuItem adminAdd = new MenuItem("            管理员新增", 4);
        MenuItem adminRemove = new MenuItem("            管理员删除", 4);
        MenuItem adminPermission = new MenuItem("            管理员权限变更", 4);
        admin.add(adminAdd);
        admin.add(adminRemove);
        admin.add(adminPermission);
        people.add(peopleAdd);
        people.add(peopleRemove);
        people.add(admin);
        Menu blackList = new Menu("  黑名单管理", 2);
        MenuItem blackListAdd = new MenuItem("        黑名单新增", 3);
        MenuItem blackListSave = new MenuItem("        黑名单更新", 3);
        blackList.add(blackListAdd);
        blackList.add(blackListSave);
        Menu permission = new Menu("  权限管理", 2);
        MenuItem permissionSelect = new MenuItem("        权限查询", 3);
        MenuItem permissionAdd = new MenuItem("        权限新增", 3);
        MenuItem permissionSave = new MenuItem("        权限更新", 3);
        permission.add(permissionSelect);
        permission.add(permissionAdd);
        permission.add(permissionSave);
        menuComponent.add(people);
        menuComponent.add(blackList);
        menuComponent.add(permission);

        menuComponent.print();
    }
}

5.5 运行结果

6.分类

6.1 透明组合模式

在组件(5.1)中就声明了复合对象(5.2)和叶子节点(5.3)的所有方法,是比较标准的,但是对于叶子节点来说,新增或删除叶子节点的方法是没有必要的。

6.2 安全组合模式

相对于透明组合模式,安全组合模式没有在组件中声明这些方法,而是在复合对象中声明,叶子节点可以不用实现这些方法。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值