一文读懂结构型模式----组合模式!

news/2024/11/21 1:23:32/

一、组合模式

1.组合模式的概述

1.1 组合模式是什么

组合模式是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

三要素:

  • 根节点(root):在一棵非空的树中只有一个根节点,这个节点可能有若干个子节点;可以根节点定义系统各层次对象的共有方法和属性
  • 子节点(node):定义子节点的行为,组合子节点和叶子节点形成一个树形结构。
  • 叶子节点(leaf):是系统层次遍历的最小单位。

1.2 组合模式应用软件菜单

我们经常在访问管理系统时发现类似下图的菜单一个菜单包含菜单项,也可以包含其他菜单项的菜单。这样使用组合模式描述菜单比较合适,有这样的需求:针对一个菜单打印出其包含所有的菜单以及菜单项的名称。

 二、详解组合模式

1.类图表示

 2.时序图表示

三、代码实现

抽象类菜单组件MenuComponent定义共有的属性和行为。

/*** 菜单组件,不管是菜单还是菜单项都是继承这个抽象类* @author: Husp* @date: 2023/8/19 13:51*/
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 name;}/*** 输出*/public void print(){throw new UnsupportedOperationException();}}

 定义子菜单Menu覆盖抽象类的属性和行为。

/*** 菜单有哪些子菜单* @author: Husp* @date: 2023/8/19 14:01*/
public class Menu extends MenuComponent {//菜单组件集合private List<MenuComponent> menuComponentList;public Menu() {}//构造函数public Menu(String name, int level){this.name=name;this.level=level;menuComponentList = new ArrayList<MenuComponent>();}//添加菜单@Overridepublic void add(MenuComponent menuComponent) {menuComponentList.add(menuComponent);}//删除菜单@Overridepublic void remove(MenuComponent menuComponent) {menuComponentList.remove(menuComponent);}//获取子菜单@Overridepublic MenuComponent getChild(int i) {return menuComponentList.get(i);}//输出@Overridepublic void print() {for (int i = 0; i < level; i++) {System.out.print("--");}System.out.println(name);for (MenuComponent menuComponent : menuComponentList) {menuComponent.print();}}}

定义菜单项MenuItem没有子菜单。

/*** 菜单项,没有子菜单* @author: Husp* @date: 2023/8/19 15:09*/
public class MenuItem extends MenuComponent{public MenuItem() {}//菜单项构造函数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);}
}

测试类

@Testvoid test(){//创建菜单树MenuMenuComponent menu1 = new Menu("服务审核",2);menu1.add(new MenuItem("医生详情-待审核",3));MenuComponent menu2 = new Menu("医生审核",2);menu2.add(new MenuItem("医生详情-待审核",3));MenuComponent menu3 = new Menu("用户管理",2);menu3.add(new MenuItem("家庭档案",3));menu3.add(new MenuItem("收货地址",3));//创建一级菜单MenuComponent component = new Menu("医生管理",1);//二级菜单添加到一级菜单component.add(menu1);component.add(menu2);component.add(menu3);//输出菜单component.print();}

测试效果:


http://www.ppmy.cn/news/1044132.html

相关文章

【rust/egui】(三)看看template的app.rs:序列化、持久化存储

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 serde app.rs中首先定义了我们的Templ…

36.SpringMVC视图

SpringMVC视图 SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图(InternalResourceView)和重定向视图(RedirectView) 配置视图&#xff1a; 当工程引入jstl的依赖&a…

Java 计算两个字符的相似度

在Java中&#xff0c;要计算两个字符的相似度&#xff0c;可以借助一些字符串相似度算法。以下是几种常见的字符串相似度算法&#xff1a; Levenshtein距离&#xff1a;也称为编辑距离&#xff0c;用于计算两个字符串之间的最小编辑操作次数&#xff08;插入、删除、替换&…

Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)

文章目录 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)DLc&#xff1a; 消息类和通信类服务器客户端 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五) DLc&#xff1a; 消息类和通信类 Message namespace Net {public class Message{p…

力扣75——单调栈

总结leetcode75中的单调栈算法题解题思路。 上一篇&#xff1a;力扣75——区间集合 力扣75——单调栈 1 每日温度2 股票价格跨度1 - 2 解题总结 1 每日温度 题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &…

「UG/NX」Block UI 面收集器FaceCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

Codeforces Round 153 (Rated for Div. 2)

目录 A. Not a Substring 题目&#xff1a; 解析&#xff1a; B. Fancy Coins 题目&#xff1a; 解析&#xff1a; C. Game on Permutation 题目&#xff1a; 解析&#xff1a; A. Not a Substring 题目&#xff1a; A bracket sequence is a string consisting of ch…