设计模式之代理模式与外观模式
目录
代理模式
简介
优缺点
角色职责
实现
运用场景
外观模式
简介
角色职责
优缺点
实现
使用场景
代理模式
简介
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介
优缺点
优点:
1.在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
2.可以扩展目标对象的功能
3.将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点:
1.会造成系统设计中类的数量增加
2.在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢
3.增加了系统的复杂度
角色职责
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能

实现
package proxy;
public class ProxyTest {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.Request();}
}
//抽象主题
interface Subject {void Request();
}
//真实主题
class RealSubject implements Subject {public void Request() {System.out.println("访问真实主题方法...");}
}
//代理
class Proxy implements Subject {private RealSubject realSubject;public void Request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.Request();postRequest();}public void preRequest() {System.out.println("访问真实主题之前的预处理。");}public void postRequest() {System.out.println("访问真实主题之后的后续处理。");}
}
运用场景
1.AOP:通过定义切面、切入点和通知等,Spring AOP在运行时生成代理对象,将切面逻辑织入到目标对象的方法调用中。代理对象在方法调用前后执行附加操作,如日志记录、性能监控等。
2.动态代理(JDK动态代理、CGLIB代理):当Bean类实现了接口时,Spring使用JDK动态代理来为Bean生成代理对象;当Bean类没有实现接口时,Spring使用CGLIB代理来生成代理对象。
外观模式
简介
提供了统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更加容易使用。

角色职责
外观角色:提供一个外观接口,对外提供一个易于客户端访问的接口,对内可以访问子系统中的所有功能。
子系统角色:子系统在整个系统中可以是一个或者多个模块,每个模块都是若干类组成,这些类之间可能相互复杂的关系。
客户端:外观接口调用测试者。
优缺点
优点:
1.减少系统相互依赖
2.提高灵活性
3.提高了安全性
缺点:
在不对外观类进行抽象的时候,如果需要添加新的子系统,就需要对外观类进行修改,违背了开闭原则
实现
public class CPU {public void startup(){System.out.println("cpu startup!");}public void shutdown(){System.out.println("cpu shutdown!");}
}public class Memory {public void startup(){System.out.println("memory startup!");}public void shutdown(){System.out.println("memory shutdown!");}
}public class Disk {public void startup(){System.out.println("disk startup!");}public void shutdown(){System.out.println("disk shutdown!");}
}public class Computer {private CPU cpu;private Memory memory;private Disk disk;public Computer(){cpu = new CPU();memory = new Memory();disk = new Disk();}public void startup(){System.out.println("start the computer!");cpu.startup();memory.startup();disk.startup();System.out.println("start computer finished!");}public void shutdown(){System.out.println("begin to close the computer!");cpu.shutdown();memory.shutdown();disk.shutdown();System.out.println("computer closed!");}
}//测试
public class User {public static void main(String[] args) {Computer computer = new Computer();computer.startup();computer.shutdown();}
}
如果没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这不是我们想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用,这,就是外观模式!
使用场景
1.对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
2.当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问
3.当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性
相关文章:
设计模式之代理模式与外观模式
目录 代理模式 简介 优缺点 角色职责 实现 运用场景 外观模式 简介 角色职责 优缺点 实现 使用场景 代理模式 简介 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为…...
动手学深度学习(四)多层感知机
目录 一、多层感知机的从零开始实现 1.1 初始化模型参数 1.2 实现Relu函数 1.3 实现模型 1.4 训练 二、多层感知机的简洁实现 2.1 实现模型 2.2 训练 三、模型选择 3.1 训练误差和泛化误差 3.2 验证数据集和测试数据集 3.3 过拟合和欠拟合 3.4 代码实现 3.4.1 生…...
融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略
9 月 21 日,融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用? 欢迎点击上方小程序报名~ 本期我们翻到《地图》的实践篇,从赛道/品类选择、目标地区适配、用户增长、变现模式、本地化运营、跨国团队管理等方面完整描绘…...
生成式人工智能促使社会转变
作者:JEFF VESTAL 了解 Elastic 如何处于大型语言模型革命的最前沿 – 通过提供实时信息并将 LLM 集成到数据分析的搜索、可观察性和安全系统中,帮助用户将 LLM 提升到新的高度。 iPhone 社会转变:新时代的黎明 曾几何时,不久前…...
【STM32】SPI初步使用 读写FLASH W25Q64
硬件连接 (1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即…...
javaScript:DOM(父子/兄弟)常用属性
目录 前言 一.父子关系 父子关系的常用属性 childNodes 获取所有的子节点 children 获取所有的子元素(dom元素) firstChild 获取元素的第一个子节点,相当于 childNodes[0] firstElementChild 获取元素的第一个元素 相当于 children[0]…...
笔记:linux中LED(GPIO)驱动设备树配置和用法
设备树中节点配置 设备树中的LED驱动一般是这样写,LED驱动可以控制GPIO的电平变化,生成文件节点很方便 leds: leds {compatible "gpio-leds";gpio_demo: gpio_demo {label "gpio_demo";gpios <&gpio0 RK_PC0 GPIO_ACTIV…...
能耗管理+分区温控成为开发节能、省电神器的关键!从此告别电费刺客时代
取暖器在人们脑海中最深刻的印象,就是费电!而它耗电量大的原因,主要在于它是靠电能直接转化为热能:在取暖设备通电后,内部高电阻的电热丝发热,风机会将这股热量吹散到室内,从而达到全屋取暖的效…...
垃圾回收 - 复制算法
GC复制算法是Marvin L.Minsky在1963年研究出来的算法。说简单点,就是只把某个空间的活动对象复制到其它空间,把原空间里的所有对象都回收掉。这是一个大胆的想法。在此,我们将复制活动对象的原空间称为From空间,将粘贴活动对象的新…...
基于SpringMVC实现常见功能
基于SpringMVC实现常见功能 防止XSS攻击 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到…...
MetInfo5.0文件包含漏洞
MetInfo历史版本与文件 环境在这里下载,使用phpstudy搭建 我们来看到这个index.php,如下图所示,其中定义了fmodule变量与module变量,其中require_once语句表示将某个文件引入当前文件,在这个代码中,通过r…...
【SpringBoot】SpringBoot实现基本的区块链的步骤与代码
以下是Spring Boot实现基本的区块链代码的步骤: 创建一个Block类,它表示一个区块,包含一个区块头和一个区块体。区块头包括版本号、时间戳、前一个区块的哈希值和当前区块的哈希值。区块体包含交易数据。 创建一个Blockchain类,它…...
Photoscan/Metashape 2.0.0中的地面激光扫描处理
在Metashape(原Photoscan)2.0.0, 结构化地面激光扫描和非结构化航空激光扫描都可以使用导入点云(文件>导入>导入点云)命令导入。导入时会保留所有点属性(包括结构化信息)。 本文讨论以下主题 如何将激光扫描数据导入项目&am…...
git快速使用
1、下载git 设置签名 2、基本概念 工作区:写代码的地方。 暂存区:.git的.index 工作区:.git 3、常用操作 本地codinggit init, 初始化一个本地仓库,项目根目录下会出现个.gitgit remote add origin gitgithub.com…...
java 实现代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它允许一个对象(代理对象)充当另一个对象(被代理对象)的接口,以控制对该对象的访问。代理模式通常用于以下情况: 远程代理…...
【每日一题】力扣1768. 交替合并字符串
题目以及链接: 1768. 交替合并字符串 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&…...
vscode新建vue3文件模板
输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…...
MySql学习笔记02——MySql的简单介绍
MySQL 常用命令 注意在mysql中使用的命令需要用英文分号结尾(启动/关闭mysql服务不需要带分号) net start mysql 启动mysql服务(需要管理员启动cmd) net stop mysql关闭mysql服务(需要管理员启动cmd) m…...
mysql-1:认识mysql
文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史:SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库],其本质是一个[文件系统],数据按照特定的…...
算法通关村-----堆在查找和排序中的应用
数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。详见le…...
2025届最火的五大降重复率神器推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把AI生成内容的痕迹降下来,其关键在于回归自然表达,具体来说&#x…...
利用快马平台快速构建ccswitch功能演示原型,十分钟搞定交互界面
最近在做一个网络工具的小项目,需要快速验证ccswitch的核心功能原型。作为一个独立开发者,时间有限但又想做出像样的演示效果,于是尝试了InsCode(快马)平台,没想到十分钟就搞定了交互界面。这里分享一下我的实现思路和具体操作步骤…...
Phi-4-mini-reasoning自动化测试方案:生成测试数据与验证逻辑
Phi-4-mini-reasoning自动化测试方案:生成测试数据与验证逻辑 1. 引言:当AI遇上软件测试 最近跟几个测试团队聊天,发现他们都在为同样的事情头疼:手工编写测试用例耗时费力,边界条件覆盖不全,测试结果验证…...
FPGA新手避坑指南:UART、SPI、I2C三大串行协议到底怎么选?
FPGA新手避坑指南:UART、SPI、I2C三大串行协议到底怎么选? 第一次接触FPGA开发时,面对琳琅满目的通信协议选择,很多新手都会感到无从下手。UART、SPI、I2C这三种最常见的串行协议各有特点,但选错协议可能导致项目延期、…...
比迪丽WebUI企业部署方案:K8s集群化管理+GPU资源弹性调度
比迪丽WebUI企业部署方案:K8s集群化管理GPU资源弹性调度 1. 引言:从单机到集群,企业级AI绘画的必经之路 如果你用过比迪丽WebUI,肯定体验过它生成动漫角色的强大能力。输入几个关键词,等上几秒钟,一张精美…...
AI编程赋能研发效率:核心能力与实践经验总结
作为常年泡在代码里的开发者,想必大家都有过这样的体验:用AI插件补几行代码很快,但一到实际项目,环境配置、多任务并行、代码审查这些环节还是得靠人工一点点磨;不同的AI编程能力各有优势,切换适配却十分繁…...
OpenClaw故障排查大全:Gemma-3-12b-it接口连接失败解决方案
OpenClaw故障排查大全:Gemma-3-12b-it接口连接失败解决方案 1. 问题背景与典型场景 上周我在本地部署Gemma-3-12b-it模型时,遭遇了OpenClaw连接失败的经典问题。明明模型服务已经启动,OpenClaw网关也显示运行正常,但每次发起请求…...
SecGPT-14B+OpenClaw联调指南:解决模型响应超时问题
SecGPT-14BOpenClaw联调指南:解决模型响应超时问题 1. 问题背景与场景定位 上周在尝试用OpenClaw调用SecGPT-14B分析一份12万字的网络安全报告时,遭遇了令人头疼的响应超时问题。这个场景很典型——当我们需要处理长文本安全分析时,模型推理…...
【第五周】关键词解释:稀疏自编码器(Sparse Autoencoder,简称 SAE)
🧠 当我们在谈论"理解"大模型时,我们在谈论什么?今天我们要聊的关键词,可能是2024-2025年大模型可解释性领域最炙手可热的技术之一:稀疏自编码器(Sparse Autoencoder,简称 SAE&#x…...
城市峡谷里,你的车是怎么知道自己在哪的?聊聊INS、NHC和轮速计(ODO)的“组合拳”
城市峡谷里,你的车是怎么知道自己在哪的?聊聊INS、NHC和轮速计(ODO)的“组合拳” 想象一下,你正驾驶车辆穿梭在纽约曼哈顿的摩天大楼之间,或是穿越一条漫长的山体隧道。突然,车载导航屏幕上的定…...
