当前位置: 首页 > news >正文

组合和外观模式

文章目录

  • 组合模式
    • 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.院系展示需求

image-20240604191023057

2.组合模式基本介绍

image-20240604191334135

3.组合模式原理类图

image-20240604191719778

4.解决的问题

image-20240604191826484

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

1.类图

image-20240604203204704

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.结果

image-20240604203529233

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

image-20240604204136380

外观模式

1.引出外观模式

1.影院管理项目

image-20240605191327104

2.传统方式解决

image-20240605191401562

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

image-20240605191617332

2.外观模式

1.基本介绍

image-20240605191822067

2.原理类图

image-20240605192317174

3.思路分析

image-20240605192426489

4.类图

image-20240605200530563

5.目录结构

image-20240605200549692

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.结果

image-20240605200842215

7.注意事项

image-20240605202400132

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

image-20240605200922262

相关文章:

组合和外观模式

文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层&#xff0c;University 可以管理 Coll…...

设置服务器禁止和ip通信

要禁止服务器与特定 IP 地址的通信&#xff0c;可以使用防火墙来设置规则。在 Ubuntu 上&#xff0c;iptables 是一个常用的防火墙工具。以下是使用 iptables 设置禁止与特定 IP 通信的步骤&#xff1a; 阻止所有进出的通信 如果你想阻止服务器与特定 IP 地址的所有通信&…...

中文技术文档的写作规范(搬运)

阮一峰老师的《中文技术文档的写作规范》搬运。 链接指路&#xff1a; https://github.com/ruanyf/document-style-guide/tree/master 内容&#xff1a;对中文技术文档从标题、文本、段落、数值、标点符号、文档体系、参考链接等七大方面进行了简明扼要的介绍。...

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…...

Python使用策略模式生成TCP数据包

使用策略模式&#xff08;Strategy Pattern&#xff09;来灵活地生成不同类型的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中常用的日志主要有如下几种&#xff1a; 这些日志通常情况下都是关闭的&a…...

XML 编辑器:功能、选择与使用技巧

XML 编辑器&#xff1a;功能、选择与使用技巧 简介 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。由于其灵活性和广泛的应用&#xff0c;XML编辑器成为开发者、数据管理者和内容创作者的重要工具。本文将探讨XML编辑器的功能、选择标准以及…...

单例模式(设计模式)

文章目录 概述1. 饿汉式&#xff08;hungry Initialization&#xff09;2. 懒汉式&#xff08;Lazy Initialization&#xff09;3.双重检查锁定&#xff08;Double-Checked Locking&#xff09;4. 静态内部类&#xff08;Static Inner Class&#xff09;5. 枚举&#xff08;Enu…...

提升你的编程体验:自定义 PyCharm 背景图片

首先&#xff0c;打开 PyCharm 的设置菜单&#xff0c;点击菜单栏中的 File > Settings 来访问设置&#xff0c;也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…...

SpringCloud与Dubbo区别?

相同点: dubbo与springcloud都可以实现RPC远程调用。 dubbo与springcloud都可以使用分布式、微服务场景下。 区别: dubbo有比较强的背景,在国内有一定影响力。 dubbo使用zk或redis作为作为注册中心 springcloud使用eureka作为注册中心 dubbo支持多种协议&#xff0c;默认使用…...

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…...

长亭培训加复习安全产品类别

下面这个很重要参加hw时要问你用的安全产品就有这个 检测类型产品 偏审计 安全防御类型 EDR类似于杀毒软件 安全评估 任何东西都要经过这个机械勘察才能上线 安全管理平台 比较杂 比较集成 审计 漏扫 评估 合在这一个平台 也有可能只是管理 主机理解为一个电脑 安了终端插件…...

memcached介绍和详解

Memcached 是一种高性能、分布式内存缓存系统&#xff0c;常用于加速动态 web 应用程序的性能&#xff0c;通过缓存数据库查询结果、对象等数据&#xff0c;减少对数据库的访问压力&#xff0c;从而提高响应速度和系统吞吐量。 ### Memcached 的特点和工作原理 #### 特点 1. …...

Spring boot 注解实现幂等性

1. 添加 Spring AOP 依赖 在 pom.xml 中添加如下依赖&#xff1a; <dependencies><!-- Spring AOP dependency --><dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-aop</artifactId></depend…...

NVIDIA Jetson AI边缘计算盒子

这里写自定义目录标题 烧录系统安装Jetpack安装cuda安装Pytorch安装onnxruntime安装qv4l2 烧录系统 选择一台Linux系统&#xff0c;或者VMware的电脑作为主机&#xff0c;烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的&#xff0c;暂时还没验证官方烧录&#x…...

React核心概念、主要特点及组件的生命周期

在前端开发的世界中&#xff0c;React以其独特的魅力和强大的功能&#xff0c;成为了构建用户界面的首选框架之一。本文将深入探讨React的核心概念、主要特点以及组件生命周期 React简介 React是由Facebook开发并开源的前端JavaScript库&#xff0c;专门用于构建可重用的UI组…...

Java基础面试重点-1

0. 符号&#xff1a; *&#xff1a;记忆模糊&#xff0c;验证后特别标注的知识点。 &&#xff1a;容易忘记知识点。 *&#xff1a;重要的知识点。 1. 简述一下Java面向对象的基本特征&#xff08;四个&#xff09;&#xff0c;以及你自己的应用&#xff1f; 抽象&#…...

18. 四数之和 - 力扣

1. 题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 …...

[vue2]深入理解路由

本节目标 单页应用程序路由概念VueRouter基本使用组件分类存放路由模块封装声明式导航其他路由配置路由模式编程式导航案例-面经基础版 单页应用程序 单页应用程序(SPA): 所有的功能都在一个HTML页面上实现 网易云音乐: 网易云音乐 多页应用程序(MPA): 不同功能通过切换不同…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...