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

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

    • 组合模式
      • 定义
      • 结构
      • 案例
      • 组合模式的分类
      • 优点
      • 使用场景

组合模式

定义

又称部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树型结构来组合对象,用来表示部分以及整体层次,这种类型的设计模式属于结构型
模式,它创建了对象组的树型结构。

结构

  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预定义一些默认行为和属性。
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树型结构。
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位。

案例

如下图,我们在访问别的一些管理系统时,经常可以看到类似的菜单。一个菜单可以包含菜单项,也可以包含带有其他菜单项的菜单,因此使用组合模式就很恰当。
需求:针对一个菜单,打印出其包含的所有菜单以及菜单项。

  • 系统管理
    • 菜单管理
      • 编辑菜单
      • 删除菜单
      • 新增菜单
    • 权限配置
      • 权限设置
      • 新增权限
    • 角色管理
      • 新增角色
      • 删除角色
        类图:
        在这里插入图片描述
/*** 菜单组件  抽象根节点*/
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 index){throw new UnsupportedOperationException();}// 获取菜单或者菜单项的名称public String getName(){return name;}// 打印菜单名称(包含子菜单和子菜单项)public abstract void print();
}
/*** 菜单类  树枝节点*/
public class Menu extends MenuComponent {// 菜单可以有多个子菜单或者子菜单项private List<MenuComponent> menuComponentList = new ArrayList<>();// 构造方法public Menu(String name, int level) {this.name = name;this.level = level;}@Overridepublic void add(MenuComponent menuComponent) {menuComponentList.add(menuComponent);}@Overridepublic void remove(MenuComponent menuComponent) {menuComponentList.remove(menuComponent);}@Overridepublic MenuComponent getChild(int index) {return menuComponentList.get(index);}@Overridepublic 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;}@Overridepublic void print() {for (int i = 0; i < level; i++) {System.out.print("—");}System.out.println(name);}
}
public class Test01 {public static void main(String[] args) {// 创建菜单树MenuComponent menu1 = new Menu("菜单管理", 2);menu1.add(new MenuItem("编辑菜单", 3));menu1.add(new MenuItem("删除菜单", 3));menu1.add(new MenuItem("新增菜单", 3));MenuComponent menu2 = new Menu("权限管理", 2);menu2.add(new MenuItem("权限设置", 3));menu2.add(new MenuItem("新增权限", 3));MenuComponent menu3 = new Menu("角色管理", 2);menu2.add(new MenuItem("新增角色", 3));menu2.add(new MenuItem("删除角色", 3));// 创建一级菜单MenuComponent component = new Menu("系统管理", 1);component.add(menu1);component.add(menu2);component.add(menu3);// 打印菜单名称(如果有子菜单一起打印)component.print();}
}

在这里插入图片描述

组合模式的分类

在使用组合模式时,根据抽象构件类的定义形式,可将组合模式分为透明组合模式和安全组合模式两种形式。

  • 透明组合模式
    在透明组合模式中,抽象根节点角色中声明了所有用于管理成员对象的方法,比如在实例中MenuComponent声明了add、remove,getChild方法,这样做的好处是确保所有的构件类都有相同的接口。透明组合模式也是组合模式的标准形式。透明组合模式的缺点是不够安全,因为叶子节点对象和容器对象在本质上是有区别的,叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此为其提供add()remove()等方法是没有意义的,这在编译阶段不会出错,但是在运行阶段如果调用这些方法可能会出错(如果没有提供相应的错误处理代码)
  • 安全组合模式
    在安全组合模式中,在抽象构件角色中没有声明任何用于管理成员对象的方法,而是在树枝节点Menu类中声明并实现这些方法。安全组合模式的缺点时不够透明,因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别的对待叶子构件和容器构件。

优点

  • 组合模式可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
  • 客户端可以一致的使用一个组合结构或者其中单个对象,不必关系处理的是单个对象还是整个组合结构,简化客户端代码。
  • 在组合模式中增加新的树枝节点和子节点都很方便,无需对现有类库进行任何修改,符合开闭原则。
  • 组合模式为树型结构的面向对象实现提供了一种灵活的解决方案,通过叶子节点和树节点的递归组合,可以形成复杂的树型结构,但对树型结构的控制却非常简单。

使用场景

出现树型结构的地方都可以使用组合模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265711.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户登录权限

文章目录 [TOC](文章目录) 前言一、 Cookie与session1.HTTP无状态2.cookie 和 session 的生命周期2.1 cookie 生命周期影响因素2.2 session 生命周期影响因素 3.cookie 和 session 的区别4.工作原理3 用户登录Node.js和Express验证session 二、JSON Web Token1. JWT 介绍2. JWT…

Aesthetically Relevant Image Captioning 美学上相关的图像字幕

1.摘要 图像美学质量评估(AQA)旨在为图像指定数字美学等级&#xff0c;而图像美学字幕(IAC)旨在生成图像美学方面的文本描述。在本文中&#xff0c;我们研究了图像AQA和IAC&#xff0c;并提出了一种新的IAC方法&#xff0c;称为审美相关图像字幕(ARIC)。基于大多数图像的文本评…

如何通过内网穿透工具实现任意浏览器远程访问Linux本地zabbix web管理界面

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

解密防泄密成功密码:银行机构案例分享迅软DSE带你走过风险之路!

近日&#xff0c;央行发布了《中国人民银行业务领域数据安全管理办法&#xff08;征求意见稿&#xff09;》&#xff0c;旨在落实《数据安全法》有关要求&#xff0c;加强中国人民银行业务领域数据安全管理。 从银行业务领域来看&#xff0c;数据主要涉及各类市场交易数据、金…

(附源码)基于ssm校园体育设施管理系统小程序-计算机毕设 70715

ssm校园体育设施管理系统小程序 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园体育设施管理系统小程…

事务--03---分布式系统唯一ID

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式ID一、什么是分布式系统唯一ID2. 二、分布式系统唯一ID的特点 分布式ID-----实现方案1、使用UUID生成分布式ID2、基于数据库自增ID3、Redis生成ID4、号段模式…

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7&#xff0c;B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…

钓鱼网站域名识别工具dnstwist算法研究

先上一个AI的回答&#xff1a; dnstwist是一种钓鱼网站域名识别工具&#xff0c;可帮助用户识别和检测可能被恶意使用的域名。它通过生成类似的域名变体来模拟攻击者可能使用的钓鱼域名&#xff0c;并提供了一系列有用的功能和信息。 dnstwist能够生成一组类似的域名变体&…

Python 自动化用处居然这么多!python自动整理文件,一键完成!

随着时代的发展及人工智能的到来&#xff0c;Python 自动化办公能力几乎已成为每个岗位的必备技能&#xff01; 而且到处可见的抖音、朋友圈铺天盖地宣传 Python 可以轻松达到办公自动化&#xff0c;并且学习没门槛&#xff0c;是真的吗&#xff1f; 我很负责的告诉大家&#…

【高数:3 无穷小与无穷大】

【高数&#xff1a;3 无穷小与无穷大】 1 无穷小与无穷大2 极限运算法则3 极限存在原则4 趋于无穷小的比较 参考书籍&#xff1a;毕文斌, 毛悦悦. Python漫游数学王国[M]. 北京&#xff1a;清华大学出版社&#xff0c;2022. 1 无穷小与无穷大 无穷大在sympy中用两个字母o表示无…

15:00面试,15:06就出来了,问的问题太变态了。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中&#xff0c;我们将使用python3作为代码语言。 步骤图例1、入口2、创建&#xff08;我们选择使用python3.7&#xff09;3、IAM权限&#xff08;…