组合和外观模式
文章目录
- 组合模式
- 1.引出组合模式
- 1.院系展示需求
- 2.组合模式基本介绍
- 3.组合模式原理类图
- 4.解决的问题
- 2.组合模式解决院系展示
- 1.类图
- 2.代码实现
- 1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法
- 2.University.java 第一层,University 可以管理 College
- 3.College.java 第二层,可以管理Department
- 4.Department.java 最底层,没有操作节点的方法
- 5.Client.java 从大到小创建对象,从小到大组合树结构
- 6.结果
- 3.JDK的HashMap使用了组合模式
- 外观模式
- 1.引出外观模式
- 1.影院管理项目
- 2.传统方式解决
- 3.传统方案的问题分析以及解决方式
- 2.外观模式
- 1.基本介绍
- 2.原理类图
- 3.思路分析
- 4.类图
- 5.目录结构
- 6.代码实现
- 1.device 子系统层
- 1.DVDPlayer.java
- 2.Popcorn.java
- 3.Projector.java
- 4.Screen.java
- 2.appearance 外观层,统一调用子系统
- 3.Client.java 客户端,直接调用外观层,不关系子系统的具体调用
- 4.结果
- 7.注意事项
- 3.外观模式在MyBatis框架的应用
组合模式
1.引出组合模式
1.院系展示需求

2.组合模式基本介绍

3.组合模式原理类图

4.解决的问题

2.组合模式解决院系展示
1.类图

2.代码实现
1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法
package com.sun;/*** Description: 总体抽象类,也可以是具体类,也可以是接口* @Author sun* @Create 2024/6/4 19:33* @Version 1.0*/
public abstract class AbsOrganizationComponent {private String name;private String des;public AbsOrganizationComponent(String name, String des) {this.name = name;this.des = des;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}protected void add(AbsOrganizationComponent absOrganizationComponent) {// 方法默认实现,因为叶子节点不需要重写这些方法throw new UnsupportedOperationException();}protected void remove(AbsOrganizationComponent absOrganizationComponent) {// 方法默认实现,因为叶子节点不需要重写这些方法throw new UnsupportedOperationException();}// 打印方法三个子类都需要实现protected abstract void print();}
2.University.java 第一层,University 可以管理 College
package com.sun;import java.util.ArrayList;
import java.util.List;/*** Description: University 可以管理 College* @Author sun* @Create 2024/6/4 19:39* @Version 1.0*/
public class University extends AbsOrganizationComponent {/*聚合总体的抽象类,目的是可以管理College*/List<AbsOrganizationComponent> organizationComponents = new ArrayList<AbsOrganizationComponent>();public University(String name, String des) {super(name, des);}@Overrideprotected void add(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.add(absOrganizationComponent);}@Overrideprotected void remove(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.remove(absOrganizationComponent);}/*** 重写print方法,打印University和College的名字*/@Overrideprotected void print() {// 首先打印自己的名字System.out.println("--------" + super.getName() + "--------");// 遍历list,打印出来College的名字for (AbsOrganizationComponent organizationComponent : organizationComponents) {organizationComponent.print();}}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic String getName() {return super.getName();}
}
3.College.java 第二层,可以管理Department
package com.sun;import java.util.ArrayList;
import java.util.List;/*** Description: College 可以管理 Department* @Author sun* @Create 2024/6/4 19:55* @Version 1.0*/
public class College extends AbsOrganizationComponent {/*聚合总体的抽象类,目的是可以管理Department(专业)*/List<AbsOrganizationComponent> organizationComponents = new ArrayList<AbsOrganizationComponent>();public College(String name, String des) {super(name, des);}@Overrideprotected void add(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.add(absOrganizationComponent);}@Overrideprotected void remove(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.remove(absOrganizationComponent);}/*** 重写print方法,打印College和Department的名字*/@Overrideprotected void print() {// 首先打印自己的名字System.out.println("--------" + super.getName() + "--------");// 遍历list,打印出来College的名字for (AbsOrganizationComponent organizationComponent : organizationComponents) {System.out.println("--------" + organizationComponent.getName() + "--------");}}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic String getName() {return super.getName();}
}
4.Department.java 最底层,没有操作节点的方法
package com.sun;/*** Description: Department是最底层的叶子节点,只有打印逻辑,没有add和remove,因为叶子节点不需要管理其他节点了* @Author sun* @Create 2024/6/4 20:03* @Version 1.0*/
public class Department extends AbsOrganizationComponent {public Department(String name, String des) {super(name, des);}protected void print() {// 这里并没有其他的集合,所以就输出自己的名字即可System.out.println("叶子节点:" + getName());}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic String getName() {return super.getName();}
}
5.Client.java 从大到小创建对象,从小到大组合树结构
package com.sun;/*** Description:* @Author sun* @Create 2024/6/4 20:09* @Version 1.0*/
public class Client {public static void main(String[] args) {// 从大到小创建对象,从小到大组合成树// 创建学校University university = new University("清华", "niubi");// 创建学院College computer = new College("计算机学院", "培养计算机人才的");College infoEngineer = new College("信息工程学院", "培养信息工程人才的");// 创建专业,并开始组合computer.add(new Department("网络安全", "网安"));computer.add(new Department("软件工程", "软工"));computer.add(new Department("计算机科学与技术", "计科"));infoEngineer.add(new Department("通信工程", "通信工程不好学"));infoEngineer.add(new Department("信息工程", "信息工程不好学"));// 将学院加入到学校中university.add(computer);university.add(infoEngineer);// 打印全部university.print();}
}
6.结果

3.JDK的HashMap使用了组合模式

外观模式
1.引出外观模式
1.影院管理项目

2.传统方式解决

3.传统方案的问题分析以及解决方式

2.外观模式
1.基本介绍

2.原理类图

3.思路分析

4.类图

5.目录结构

6.代码实现
1.device 子系统层
1.DVDPlayer.java
package com.sun.device;/*** Description: 一个播放器* @Author sun* @Create 2024/6/5 19:27* @Version 1.0*/
public class DVDPlayer {// 使用饿汉式的单例模式private static DVDPlayer instance = new DVDPlayer();public static DVDPlayer getInstance() {return instance;}// 一些方法public void on() {System.out.println("DVD on");}public void off() {System.out.println("DVD off");}public void play() {System.out.println("DVD is playing");}
}
2.Popcorn.java
package com.sun.device;/*** Description: 爆米花机* @Author sun* @Create 2024/6/5 19:30* @Version 1.0*/
public class Popcorn {// 使用饿汉式的单例模式private static Popcorn instance = new Popcorn();public static Popcorn getInstance() {return instance;}// 一些方法public void on() {System.out.println("Popcorn on");}public void off() {System.out.println("Popcorn off");}public void pop() {System.out.println("Popcorn is poping");}
}
3.Projector.java
package com.sun.device;/*** Description: 投影仪* @Author sun* @Create 2024/6/5 19:31* @Version 1.0*/
public class Projector {// 使用饿汉式的单例模式private static Projector instance = new Projector();public static Projector getInstance() {return instance;}// 一些方法public void on() {System.out.println("Projector on");}public void off() {System.out.println("Projector off");}public void focus() {System.out.println("Projector is focusing");}
}
4.Screen.java
package com.sun.device;/*** Description: 屏幕* @Author sun* @Create 2024/6/5 19:34* @Version 1.0*/
public class Screen {// 使用饿汉式的单例模式private static Screen instance = new Screen();public static Screen getInstance() {return instance;}// 一些方法public void up() {System.out.println("Screen up");}public void down() {System.out.println("Screen down");}
}
2.appearance 外观层,统一调用子系统
package com.sun.appearance;import com.sun.device.DVDPlayer;
import com.sun.device.Popcorn;
import com.sun.device.Projector;
import com.sun.device.Screen;/*** Description: 未使用外观模式的调用方式* @Author sun* @Create 2024/6/5 19:44* @Version 1.0*/
public class HomeTheaterFacade {// 定义各个子系统的对象private DVDPlayer dvdPlayer;private Popcorn popcorn;private Projector projector;private Screen screen;public HomeTheaterFacade() {this.dvdPlayer = DVDPlayer.getInstance();this.popcorn = Popcorn.getInstance();this.projector = Projector.getInstance();this.screen = Screen.getInstance();}// 操作分为3步// 1、准备阶段public void ready() {dvdPlayer.on();popcorn.on();projector.on();screen.up();}// 2、播放public void play() {dvdPlayer.play();}// 3、关闭public void shutdown() {dvdPlayer.off();popcorn.off();projector.off();screen.down();}}
3.Client.java 客户端,直接调用外观层,不关系子系统的具体调用
package com.sun;import com.sun.appearance.HomeTheaterFacade;/*** Description: Client* @Author sun* @Create 2024/6/5 19:53* @Version 1.0*/
public class Client {public static void main(String[] args) {HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();homeTheaterFacade.ready();homeTheaterFacade.play();homeTheaterFacade.shutdown();}
}
4.结果

7.注意事项

3.外观模式在MyBatis框架的应用

相关文章:
组合和外观模式
文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层,University 可以管理 Coll…...
设置服务器禁止和ip通信
要禁止服务器与特定 IP 地址的通信,可以使用防火墙来设置规则。在 Ubuntu 上,iptables 是一个常用的防火墙工具。以下是使用 iptables 设置禁止与特定 IP 通信的步骤: 阻止所有进出的通信 如果你想阻止服务器与特定 IP 地址的所有通信&…...
中文技术文档的写作规范(搬运)
阮一峰老师的《中文技术文档的写作规范》搬运。 链接指路: https://github.com/ruanyf/document-style-guide/tree/master 内容:对中文技术文档从标题、文本、段落、数值、标点符号、文档体系、参考链接等七大方面进行了简明扼要的介绍。...
「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具,可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…...
Python使用策略模式生成TCP数据包
使用策略模式(Strategy Pattern)来灵活地生成不同类型的TCP数据包。 包括三次握手、数据传输和四次挥手。 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethodclass TcpPacketStrategy(A…...
无文件落地分离拆分-将shellcode从文本中提取-file
马子分为shellcode和执行代码. --将shellcode单独拿出,放在txt中---等待被读取执行 1-cs生成python的payload. 2-将shellcode进行base64编码 import base64code b en_code base64.b64encode(code) print(en_code) 3-将编码后的shellcode放入文件内 4-读取shellcod…...
MySQL 日志(一)
本篇主要介绍MySQL日志的相关内容。 目录 一、日志简介 常用日志 一般查询日志和慢查询日志的输出形式 日志表 二、一般查询日志 三、慢查询日志 四、错误日志 一、日志简介 常用日志 在MySQL中常用的日志主要有如下几种: 这些日志通常情况下都是关闭的&a…...
XML 编辑器:功能、选择与使用技巧
XML 编辑器:功能、选择与使用技巧 简介 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。由于其灵活性和广泛的应用,XML编辑器成为开发者、数据管理者和内容创作者的重要工具。本文将探讨XML编辑器的功能、选择标准以及…...
单例模式(设计模式)
文章目录 概述1. 饿汉式(hungry Initialization)2. 懒汉式(Lazy Initialization)3.双重检查锁定(Double-Checked Locking)4. 静态内部类(Static Inner Class)5. 枚举(Enu…...
提升你的编程体验:自定义 PyCharm 背景图片
首先,打开 PyCharm 的设置菜单,点击菜单栏中的 File > Settings 来访问设置,也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…...
SpringCloud与Dubbo区别?
相同点: dubbo与springcloud都可以实现RPC远程调用。 dubbo与springcloud都可以使用分布式、微服务场景下。 区别: dubbo有比较强的背景,在国内有一定影响力。 dubbo使用zk或redis作为作为注册中心 springcloud使用eureka作为注册中心 dubbo支持多种协议,默认使用…...
简单Mesh多线程合并,使用什么库性能更高
1)简单Mesh多线程合并,使用什么库性能更高 2)Unity Semaphore.WaitForSignal耗时高 3)VS编辑的C#代码注释的中文部分乱码 4)变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送,精选了…...
长亭培训加复习安全产品类别
下面这个很重要参加hw时要问你用的安全产品就有这个 检测类型产品 偏审计 安全防御类型 EDR类似于杀毒软件 安全评估 任何东西都要经过这个机械勘察才能上线 安全管理平台 比较杂 比较集成 审计 漏扫 评估 合在这一个平台 也有可能只是管理 主机理解为一个电脑 安了终端插件…...
memcached介绍和详解
Memcached 是一种高性能、分布式内存缓存系统,常用于加速动态 web 应用程序的性能,通过缓存数据库查询结果、对象等数据,减少对数据库的访问压力,从而提高响应速度和系统吞吐量。 ### Memcached 的特点和工作原理 #### 特点 1. …...
Spring boot 注解实现幂等性
1. 添加 Spring AOP 依赖 在 pom.xml 中添加如下依赖: <dependencies><!-- Spring AOP dependency --><dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-aop</artifactId></depend…...
NVIDIA Jetson AI边缘计算盒子
这里写自定义目录标题 烧录系统安装Jetpack安装cuda安装Pytorch安装onnxruntime安装qv4l2 烧录系统 选择一台Linux系统,或者VMware的电脑作为主机,烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的,暂时还没验证官方烧录&#x…...
React核心概念、主要特点及组件的生命周期
在前端开发的世界中,React以其独特的魅力和强大的功能,成为了构建用户界面的首选框架之一。本文将深入探讨React的核心概念、主要特点以及组件生命周期 React简介 React是由Facebook开发并开源的前端JavaScript库,专门用于构建可重用的UI组…...
Java基础面试重点-1
0. 符号: *:记忆模糊,验证后特别标注的知识点。 &:容易忘记知识点。 *:重要的知识点。 1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用? 抽象&#…...
18. 四数之和 - 力扣
1. 题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 …...
[vue2]深入理解路由
本节目标 单页应用程序路由概念VueRouter基本使用组件分类存放路由模块封装声明式导航其他路由配置路由模式编程式导航案例-面经基础版 单页应用程序 单页应用程序(SPA): 所有的功能都在一个HTML页面上实现 网易云音乐: 网易云音乐 多页应用程序(MPA): 不同功能通过切换不同…...
终极CH55xduino指南:5分钟构建低成本USB微控制器项目
终极CH55xduino指南:5分钟构建低成本USB微控制器项目 【免费下载链接】ch55xduino An Arduino-like programming API for the CH55X 项目地址: https://gitcode.com/gh_mirrors/ch/ch55xduino CH55xduino为CH55X系列低成本MCS51 USB微控制器提供了完整的Ardu…...
Mac磁盘工具里找不到APFS格式?别急,可能是你的U盘分区表选错了(GUID分区图详解)
Mac磁盘工具里找不到APFS格式?可能是分区表惹的祸 当你准备将外置存储设备格式化为APFS时,却发现磁盘工具里压根没有这个选项——这种场景对Mac用户来说并不陌生。上周帮同事迁移数据时就遇到了这个典型问题:一块全新的SSD移动硬盘插入MacBoo…...
基于MCP协议构建加密货币数据查询工具:coinpaprika-mcp详解
1. 项目概述:一个连接加密货币数据世界的桥梁 最近在折腾一个需要实时获取多种加密货币数据的项目,从价格、市值到社区动态,需求五花八门。市面上数据源不少,但要么API调用限制太死,要么数据维度不够全,要…...
合并报表的10个基本逻辑原理,0基础也能看懂
合并报表真正的门槛不在分录,而在思维方式。单体报表做久了,容易不自觉地站在一家公司的视角去看业务,但合并报表要求你立刻跳出来,用一个“虚构的大集团”的眼睛去重新审视所有交易。这种视角切换,往往比具体的抵销技…...
音频处理中的头部空间标准化:原理、工具与工程实践
1. 项目概述:一个为音频处理而生的“头部空间”工具如果你经常处理音频,尤其是人声干音,那你一定对“头部空间”这个概念不陌生。简单来说,它指的是人声录音中,人声峰值电平与数字满刻度(0 dBFS)…...
【从零学Vibe Coding】第二章:大模型到底是怎么工作的(小白版)
第二章:大模型到底是怎么工作的(小白版) 为什么要了解原理? 很多人一边用 AI 写代码,一边又觉得它像魔法。魔法感越强,失望也越大。 因为一旦它出错,你就不知道问题出在哪,只能骂一…...
7个核心功能彻底改变你的Obsidian笔记视觉体验
7个核心功能彻底改变你的Obsidian笔记视觉体验 【免费下载链接】AnuPpuccin Personal theme for Obsidian 项目地址: https://gitcode.com/gh_mirrors/an/AnuPpuccin 你是否厌倦了Obsidian默认的单调界面?是否在寻找一种能让笔记创作变得更愉悦、更高效的视觉…...
用STM32F103和电位器给你的无刷电机做个“油门”:手把手实现ADC调速(附完整代码)
用STM32F103和电位器打造无刷电机调速系统:从硬件连接到代码实战 旋转电位器旋钮就能精准控制无刷电机转速,这种直观的交互方式在机器人、无人机和工业控制领域有着广泛应用。本文将带您从零开始,基于STM32F103微控制器构建完整的电位器调速…...
别再只盯着DICOM了!用Python的nibabel库处理NII格式医学影像,从数据加载到3D可视化全流程
解锁医学影像分析新维度:Pythonnibabel全流程处理NII格式实战指南 在医学影像分析领域,DICOM格式长期占据主导地位,但越来越多的研究者发现,在处理神经影像数据时,NII/NIfTI格式展现出独特的优势。这种专为脑科学研究…...
Python应用性能监控实战:New Relic探针架构与部署指南
1. 项目概述:一个现代应用性能管理的Python探针如果你正在用Python开发Web应用、微服务或者任何需要对外提供服务的后端系统,那么“性能”和“可观测性”这两个词一定不会陌生。当线上服务突然变慢、错误率飙升,或者用户反馈某个接口卡顿时&a…...
