代理模式
如有错误或有补充,以及任何改进的意见,请留下您的高见
定义
代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式是一种结构型模式,它可以在不修改源码的情况下增强方法,在方法前后增加日志记录、权限管理等功能。
代理模式可以分为静态代理和动态代理两种。静态代理是在代码实现阶段就确定了代理类与目标类之间的关系,而动态代理是在运行时动态生成代理类。Java中,使用反射机制来实现动态代理。
简单来说,就是把原来的实现类A,在直接访问它的基础上,用B类作为中介,让本来 直接访问A 的行为变成:访问B->B给A发出指令->A实现命令。
他都有以下几个组成
抽象主题(Subject):
定义了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
真实主题(Real Subject):实现了抽象主题接口,是代理对象所代表的真实对象。客户端直接访问真实主题,但在某些情况下,可以通过代理主题来间接访问。
代理(Proxy):实现了抽象主题接口,并持有对真实主题的引用。代理主题通常在真实主题的基础上提供一些额外的功能,例如延迟加载、权限控制、日志记录等。
客户端(Client):使用抽象主题接口来操作真实主题或代理主题,不需要知道具体是哪一个实现类。
优缺点
优点
- 隐藏实现细节:代理模式可以隐藏实现对象的细节,客户端只需要与代理对象交互即可,无需了解实现细节。这样可以降低客户端与实现对象之间的耦合度,提高系统的可维护性和可扩展性。
- 增强安全性:代理模式可以增强安全性,代理对象可以对客户端的请求进行过滤和验证,从而确保请求的合法性。例如,安全代理可以控制对对象的访问权限,只有满足一定条件的用户才能访问对象。
- 提高性能:代理模式可以提高性能,代理对象可以缓存请求结果,从而减少对实现对象的访问次数,提高系统的响应速度。例如,缓存代理可以缓存对象的结果,当下次请求相同的参数时,可以直接返回缓存的结果,而不需要再次执行耗时的计算过程。
- 实现松耦合:代理模式可以实现松耦合,代理对象可以在客户端和实现对象之间起到中介的作用,使得系统的结构更加灵活和可扩展。客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则。
- 方便远程调用:代理模式可以实现远程代理,将请求发送到远程服务器,并将结果返回给客户端。这样可以隐藏客户端和服务器之间的网络通信细节,使得客户端可以更方便地访问远程服务。
- 实现虚拟代理:虚拟代理是一种延迟加载的技术,它可以在需要时才创建真实对象。虚拟代理通常用于加载比较耗费资源的对象,例如大图像或者数据库连接等。通过延迟加载,可以提高系统的性能。
缺点
- 增加复杂性:代理模式需要实现代理对象和实现对象之间的交互逻辑,增加了代码的复杂性和维护成本。
- 降低响应速度:由于代理对象需要处理客户端的请求,可能会增加系统的负担和延迟,导致响应速度降低。
- 增加内存占用:代理对象需要缓存请求结果,可能会占用较多的内存空间。
- 不适合处理复杂对象:由于代理对象需要和实现对象保持一致的接口,可能会导致接口和代码的复杂性增加,不适合处理复杂对象。
- 静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法,导致大量的代码重复,增加了代码维护的复杂度。
- 静态代理只服务于一种类型的对象,如果要服务多类型的对象,势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任。
示例
// 客户端
public class Client {public static void main(String[] args) {}
}// 抽象主题
interface AbstractSubject{}// 真实主题
class Subject implements AbstractSubject {public int sum(int a, int b) {return a + b;}
}// 代理
class Proxy {private Subject subject;public Proxy(Subject subject) {this.subject = subject;}// 这里代理实现,用Proxy的public int sum(int a, int b) {/*可能再添加的代码逻辑*/return subject.sum(a, b);}
}
相关文章:
代理模式
如有错误或有补充,以及任何改进的意见,请留下您的高见 定义 代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式是一种结构型模式,它可以在不修改源码的情况下增强方法,在方法前后增…...
C++三剑客之std::any(一) : 使用
相关系列文章 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二):深入剖析 目录 1.概述 2.构建方式 2.1.构造函数 2.2.std::make_any 2.3.operator分配新值 3.访问值…...
2024年:用OKR管理你的生活
在科技高速发展的时代,越来越多的企业和团队开始采用OKR(Objectives and Key Results)管理方法来设定目标并跟踪进度。你是否想过,将OKR理念引入个人生活,以更有效地实现人生目标?本文将探讨如何在2024年运…...
Lua迭代器以及各种源函数的实现
范型for 范型for的格式如下所示: for <var-list> in <exp-list> do<body> end var-list指变量名列表,可以为多个,exp-list指表达式列表,通常情况下只有一个值。可以更具体地写为另一种形式: fo…...
e5 服务器具备哪些性能特点?
随着云计算和大数据技术的不断发展,服务器作为数据中心的核心设备,其性能特点也日益受到关注。其中,E5服务器作为当前主流的服务器类型之一,具备许多优秀的性能特点。本文将详细介绍E5服务器的性能特点,帮助读者更好地…...
《C++ Primer Plus》《2、开始学习C++》
文章目录 0 前言:1 进入C1.1 main()函数1.2 C注释1.3 预处理器和iostream1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.7 C源代码的格式化 2 C语句2.1 声明语句和变量2.2 赋值语句2.3 cout语句 3 其他C语句3.1使用cin3.2 使用cout进行拼接3.3 类简介 4 函数4.1 …...
Backtrader 文档学习- Sizers
Backtrader 文档学习- Sizers 1.概述 智能仓位 Strategy提供了交易方法,即:buy,sell和close。看一下buy的定义: def buy(self, dataNone,sizeNone, priceNone, plimitNone,exectypeNone, validNone, tradeid0, **kwargs):注意&…...
基于YOLOv8算法的照片角度分类项目实践
目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …...
go语言进阶篇——面向对象(一)
什么是面向对象 在我们设计代码时,比如写一个算法题或者写一个问题结局办法时,我们常常会使用面向过程的方式来书写代码,面向过程主要指的是以解决问题为中心,按照一步步具体的步骤来编写代码或者调用函数,他在问题规…...
C#,栅栏油漆算法(Painting Fence Algorithm)的源代码
1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏,找出油漆围栏的方法,使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的,所以返回10^97的模。 计算结果: 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…...
java_error_in_pycharm.hprof文件是什么?能删除吗?
java_error_in_pycharm.hprof文件是什么?能删除吗? 🌵文章目录🌵 🌳引言🌳🌳hprof格式文件介绍🌳🌳java_error_in_pycharm.hprof文件什么情况下能删除🌳&…...
LeetCode 491 递增序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范围是 [-…...
考研/计算机二级数据结构刷题之顺序表
目录 第一题 顺序表的初始化,销毁,头插,尾插,头删,尾删,指定位置插入,指定删除以及打印 第二题 移除元素 题目链接: OJ链接 题目详解:移除元素 第三题:删…...
Git 代码协同的使用方法 for Azure DevOps
1. 登陆Azure 步骤1.1. VS Code,登陆Azure Cloud的Ubuntu环境,如下: 重点: 这里的Azure Cloud的用户名是YourAzureUserName,口令是YourAzurePassword 步骤1.2. 登陆Azure Cloud的Ubuntu环境后,配置Git账户信息&…...
数据库学习笔记2024/2/5
2. SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…...
PSM-Net根据Stereo图像生成depth图像
一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…...
Mocaverse NFT 概览与数据分析
作者:stellafootprint.network 编译:mingfootprint.network 数据源:Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT(非同质化代币)系列,包含 8,888 个独特的 "M…...
SpringBoot之事务源码解析
首先事务是基于aop的,如果不了解aop的,建议先去看下我关于aop的文章: Spring之aop源码解析 先说结论,带着结论看源码。首先,在bean的生命周期中, 执行实例化前置增强,会加载所有切面并放入缓存࿰…...
FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持
目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构FPGA逻辑设计工程源码架构SDK软件工程源…...
基于高通滤波器的ECG信号滤波及心率统计matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ECG信号简介 4.2 高通滤波器原理 4.3 心率统计 5.完整工程文件 1.课题概述 通过高通滤波器对ECG信号进行滤波,然后再统计其心率。 2.系统仿真结果 3.核心程序与模型 版本:…...
cv_resnet50_face-reconstruction效果对比:不同光照/姿态下人脸重建质量实测报告
cv_resnet50_face-reconstruction效果对比:不同光照/姿态下人脸重建质量实测报告 你是不是也好奇,一个基于ResNet50的人脸重建模型,到底能把一张照片还原到什么程度?它能不能处理好那些光线不好、角度刁钻的照片?今天…...
手把手教学:用LongCat动物百变秀快速生成动物拟人化表情包和头像
手把手教学:用LongCat动物百变秀快速生成动物拟人化表情包和头像 1. 为什么选择LongCat动物百变秀 在当今社交媒体时代,个性化的动物表情包和头像已经成为网络交流的重要组成部分。LongCat动物百变秀是一款基于美团开源模型的本地化AI图像编辑工具&…...
Pixel Dream Workshop 作品集:基于LSTM时序模型生成的动态艺术画展示
Pixel Dream Workshop 作品集:基于LSTM时序模型生成的动态艺术画展示 1. 当AI遇见艺术:LSTM如何创造动态视觉叙事 在数字艺术创作领域,时序模型正带来一场革命性的变化。Pixel Dream Workshop最新推出的动态艺术画系列,展示了长…...
告别Electron臃肿!用Tauri 2.0 + Rust打造你的第一个轻量级桌面应用(附完整项目结构解析)
从Electron到Tauri 2.0:用Rust重构现代桌面应用开发范式 当Electron应用体积膨胀到200MB起步时,我们不得不重新思考桌面开发的未来。Tauri 2.0的出现绝非偶然——这是前端开发者对性能与体验的集体觉醒。本文将带你深入这个基于Rust的轻量级框架…...
Jieba分词实战:5分钟搞定中文文本词频统计(附完整代码)
Jieba分词实战:5分钟搞定中文文本词频统计(附完整代码) 中文文本处理是自然语言处理(NLP)的基础环节,而分词则是中文文本处理的第一步。不同于英文等空格分隔的语言,中文文本需要专门的工具进行…...
深入解析Cache工作原理与多核一致性机制
深入理解Cache工作原理与技术实现1. 计算机体系中的Cache基础1.1 Cache存在的必要性现代计算机系统中,处理器性能与存储器访问性能之间存在显著差距。从历史发展数据来看,CPU计算性能每18个月翻一番(遵循摩尔定律),而D…...
别光看原理了!用STM32F407从零撸一个四轴飞控代码(附完整工程)
用STM32F407从零构建四轴飞控代码实战指南 当你在论坛上看到别人分享的无人机飞行视频,是否也曾心动想亲手打造一套自己的飞控系统?市面上大多数教程止步于理论讲解,真正落实到代码层面的少之又少。本文将带你用STM32F407开发板,…...
从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)
从CentOS 7迁移到Ubuntu 22.04 LTS:系统初始化与性能调优全指南 当CentOS 7走向生命周期的终点,许多运维团队正面临向新平台的战略转移。Ubuntu 22.04 LTS以其长期支持特性和活跃的社区生态,成为最受欢迎的替代选择之一。但迁移绝非简单的系统…...
MATLAB驱动的焊接机器人智能轨迹优化与动态仿真实践
1. 焊接机器人轨迹优化的技术挑战 焊接机器人在现代制造业中扮演着越来越重要的角色,但要让机器人焊得又快又好,可不是件简单的事。想象一下,你要用焊枪在复杂的三维曲面上画出一条完美的焊缝,既要保证焊接质量,又要避…...
文件夹色彩标记系统:Folcolor效能倍增指南
文件夹色彩标记系统:Folcolor效能倍增指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 在信息爆炸的数字化时代,Windows用户每天面对成百上千个黄色文件夹&#…...
