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

代理模式Proxy

一、代理模式(Proxy)
1.代理模式的定义

代理模式给某一个对象提供一个代理对象,并由代理对象控制对真实对象的访问,起到对代理对象已有功能的增强

通俗的来讲代理模式就是我们生活中常见的中介。

2.作用
  • 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,

而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

  • 开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理

类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。

3.代理模式的分类

我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:

  • 静态代理:

静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

  • 动态代理:

动态代理是在程序运行时通过反射机制动态创建的。

    • 动态代理分为:

基于接口的动态代理(jdk自带)

基于子类的动态代理(第三方)

二、静态代理

所谓“静态 ”也就是在程序运行前就已经存在代理类的字节码文件,代理类和被代理对象的关系在运行前就确定了。

1.定义接口

interface ISinger{public void sing();
}

2.定义被代理类

public class SingerImp implements Isinger{@Overridepublic void sing(){Systm.out.println("===莫等闲===");}
}

3.定义代理类

public class SingerProxy implements Isinger{Isinger realsinger;public SingerProxy(Isinger realsinger) {this.realsinger = realsinger;}@Overridepublic void sing(){Systm.out.println("大家好");realsinger.sing();Systm.out.println("谢谢");}
}

4.定义客户端,查看执行结果

public class Test {public static void main(String[] args) {//1.创建被代理对象Isinger realsinger = new SingerImp();//2.创建代理Isinger proxysinger = new SingerProxy(realsinger);proxysinger.sing();}
}

输出结果:

大家好

莫等闲

谢谢

从上面的代码可以看出,静态代理存在被代理类和代理类之间耦合度过高。

三、动态代理

“动态”代理的源码是在程序运行期间由 JVM 根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件。

1.使用JDk

1.1 定义接口

interface ISinger{public void sing();
}

1.2 定义被代理类

public class ZhaoYiTing implements ISinger{@Overridepublic void sing() {System.out.println("===易燃易爆炸===");}
}

1.3 定义客户端,查看执行结果

public class test01 {public static void main(String[] args) {//1.创建被代理对象ISinger zhaoYiTing = new ZhaoYiTing();//2.创建代理对象ISinger jinjiren = (ISinger)Proxy.newProxyInstance(zhaoYiTing.getClass().getClassLoader(), zhaoYiTing.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//功能增强System.out.println("===自我介绍===");Object obj = method.invoke(zhaoYiTing, args);return obj;}});jinjiren.sing();}
}

输出结果:

===自我介绍===

===易燃易爆炸===

2.使用第三方(CGLIB)

2.1 定义接口

interface ISinger{public void sing();
}

2.2 定义被代理类

public class ZhaoYiTing implements ISinger{@Overridepublic void sing() {System.out.println("莫等闲");}
}

2.3 定义客户端,查看执行结果

public class test {public static void main(String[] args) {ISing imp = new tenggeerImp();ISing jin = (ISing)Enhancer.create(imp.getClass(), imp.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {Object obj = method.invoke(imp, objects);return obj;}});jin.sing();}
}

输出结果:

莫等闲

相关文章:

代理模式Proxy

一、代理模式(Proxy) 1.代理模式的定义 代理模式给某一个对象提供一个代理对象,并由代理对象控制对真实对象的访问,起到对代理对象已有功能的增强 通俗的来讲代理模式就是我们生活中常见的中介。 2.作用 中介隔离作用&#x…...

C++ 设计模式——抽象工厂模式

抽象工厂模式 抽象工厂模式 抽象工厂模式主要组成部分代码实现抽象工厂模式模式的 UML 图抽象工厂模式 UML 图解析优点和缺点适用场景 抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它通常用于需要创建多个产品…...

《亿级流量系统架构设计与实战》第十一章 Timeline Feed服务

Timeline Feed服务 一、概述1、分类2、功能 二、设计原理1、拉模式与用户发件箱2、推模式与用户收件箱3、推拉模式结合 三、关键技术1、内容与用户收件箱的交互(推模式)2、推送拆分子任务3、收件箱模型设计 内容总结自《亿级流量系统架构设计与实战》 一…...

氙灯老化试验箱试验机

氙灯老化试验箱,采用6.5KW大功率的精密水冷式氙灯,曝晒面积达到了6500cm2 功能强大,测试结果可靠 ◆ 满足国内外所有氙灯测试标准要求。 ◆ 采用氙灯灯管及滤光器组件,保证试验数据的可比性和重现性。 ◆ 自动旋转式三层鼓型样板架…...

【Qt】常用控件QRadioButton

常用控件QRadioButton QRadioButton是单选按钮,可以在多个选项中选择一个。 作为QAbstractButton和QWidget的子类,其属性和用法,对于QRadioButton同样适用。 属性说明 checkable 是否能选中 checked 是否已经被选中. checkable 是 checked…...

Mysql 离线版下载安装-(详细版)

Mysql 离线版下载安装-(详细版) 文章目录 Mysql 离线版下载安装-(详细版)1.0 下载地址2.0 解压到本地2.0.1 配置环境变量2.0.2 新建mysql配置文件ini2.0.3使用管理员启动 cmd 3.0 初始化密码忘记了4.0 修改初始化密码5.0 使用可视化工具登录Mysql 1.0 下载地址 地址&#xff1…...

Spring Boot和OCR构建车牌识别系统

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 OCR介绍 OCR(Optical Character Recognition)是光学字符识别技术的缩写,它能够将图像中的文本转换为机器可读和编辑的数字文本格式。这种技术广泛应用于数据输入、文档管理…...

Java-自定义注解中成员变量是Class<?>

在Java中,自定义注解可以包含各种类型的成员变量,包括 Class<?> 类型。这种类型的成员变量 通常用于表示某个类的类型信息。下面我将详细介绍如何定义一个包含 Class<?> 类型成员变量的 自定义注解,并给出一些示例代码。 1. 定义自定义注解 定义一个自定义…...

SX_UNIX套接字通信_15

UNIX套接字通信的优势&#xff1a; UNIX套接字通信常用于一个项目中的进程之间通信&#xff0c;UNIX提供了与网络套接字相似的特性&#xff0c;但是避免了网络延迟&#xff0c;提高了性能&#xff0c;但是它只能在同一台机器上使用&#xff0c;无法跨越网络的进程间通信 实例&…...

JS模块化总结 | CommonJS、ES6

BV13W42197jR 个人笔记 目录 JS模块化基础知识1. 概述1.1 什么是模块化1.2 为什么需要模块化? 2 模块化规范3 导入&导出4 CommonJS规范4.1 初步体验4.2 导出数据4.3 导入数据4.4 扩展理解4.5 浏览器端运行 5 ES6模块化规范5.1 初步体验5.2 Node中运行ES65.3 导出数据①分别…...

25考研计算机组成原理复习·3.5高速缓冲存储器

高速缓冲存储器Cache 工作原理&#xff1a;将某些主存块复制到Cache中&#xff0c;缓和CPU与主存之间的速度矛盾局部性原理 时间局部性&#xff1a;现在访问的地址&#xff0c;不久之后也很可能被再次访问空间局部性&#xff1a;现在访问的地址&#xff0c;其附近的地址也很可…...

餐厅管理系统

目录 一、 系统简介 1.1需求分析 1.2 编程环境与工具 二、 系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 三、 主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#xff08;3&#xf…...

杭州百腾教育科技 TiDB 6.5 to 7.5 升级记录

作者&#xff1a; reAsOn2010 原文来源&#xff1a; https://tidb.net/blog/612103f3 背景 使用 TiDB 作为我们的全量数据库已经有六七年了&#xff0c;当时还是 2.0 版本。早期TiDB的迭代和新特性的发布对于实际使用的影响还是很大的&#xff0c;所以从那个时候开始就有每…...

Redis的缓存穿透、击穿、雪崩

目录 缓存穿透 定义&#xff1a; 解决方法&#xff1a; 缓存击穿 定义&#xff1a; 解决方案&#xff1a; 缓存雪崩 定义&#xff1a; 解决方案&#xff1a; 缓存穿透、缓存击穿和缓存雪崩的区别 缓存穿透 定义&#xff1a; 查询一个不存在的数据&#xff0c;数据库未…...

【Django开发】前后端分离django美多商城项目第1篇:欢迎来到美多 项目主要页面介绍【附代码文档】

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…...

【软件造价咨询】信息化项目预算评审看什么?

在信息化项目预算评审中&#xff0c;各方往往只重视预算金额部分&#xff0c;而忽视了项目建设的全局性和整体性把关&#xff0c;导致信息系统的重复建设、分散建设、业务和系统两张皮、重功能轻数据、重投资轻方案等问题频出&#xff0c;从而大幅降低财政投资效益。 例如&…...

第37讲:Cephfs文件系统的正确使用姿势

文章目录 1.Cephfs文件系统简介2.Cephfs文件系统细节介绍2.1.Cephfs文件系统多客户端隔离挂载2.2.Ceph集群中多个Cephfs如何单独使用 3.挂载多个Cephfs文件系统4.Cephfs文件系统多客户端隔离挂载实战4.1.创建一个Cephfs文件系统4.2.将Cephfs文件系统挂载到本地路径4.3.在Cephfs…...

单片机烧录

在设计芯片的时候&#xff0c;关于烧录的环节是一个不得不考虑的问题。 我们首先排除掉&#xff0c;由外部直接硬件操控FLASH 的方案&#xff0c;这个方案有很多缺点。 1、每个IC使用的FLASH型号是各不相同的&#xff0c;每种型号的FLASH的烧录命令和流程都有差别&#xff0c;这…...

mysql实现分布式锁

利用数据库的悲观锁实现分布式锁,实际应用中要考虑mysql的高可用。 DistributedLock.h #ifndef DistributedLock_H_ #define DistributedLock_H_// // DistributedLock.h: // #include "base/MySQLDriver.h" class CDistributedLock { public://// Construction/D…...

MySQL快速使用

关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点&#xff1a;使用表存储数据&#xff0c;格式统一方便维护&#xff1b;使用SQL语言操作&#xff0c;标准统一使用方便 通用语法&#xff1a; …...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

基础测试工具使用经验

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

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...