代理模式例子

article/2025/10/2 6:19:54

1.概念

代理模式就是为某个对象提供一种代理,以控制对这个对象的访问。

2.涉及角色

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

3.静态代理例子

以打游戏,找教练为例。你就是被代理对象,教练就是代理类。
教练可以在你打游戏的前后给你一些指导,但是真正打游戏的还是你自己,不是教练。

这里写图片描述

下面看代码:

public interface IGamePlayer {/** 登陆游戏*/public void login();/** 杀怪*/public void killBoss();/** 升级*/public void upgrade();
}
public class GamePlayer implements IGamePlayer{String name;public GamePlayer(String name) {this.name = name;}@Overridepublic void login() {System.out.println(name+"已登陆游戏!");}@Overridepublic void killBoss() {System.out.println(name+"正在刷怪!");}@Overridepublic void upgrade() {System.out.println("恭喜升级!");}}
public class GamePlayProxy implements IGamePlayer{IGamePlayer gamePlay;/** 构造函数*/public GamePlayProxy(IGamePlayer gamePlay) {this.gamePlay = gamePlay;}@Overridepublic void login() {System.out.println("--->开始玩游戏前,教练指导战术!");this.gamePlay.login();}@Overridepublic void killBoss() {this.gamePlay.killBoss();}@Overridepublic void upgrade() {this.gamePlay.upgrade();System.out.println("--->游戏结束,教练总结经验!");}}
/** 客户端*/
public class App {public static void main(String[] args) {GamePlayer gamePlay = new GamePlayer("张三");GamePlayProxy proxy = new GamePlayProxy(gamePlay);proxy.login();proxy.killBoss();proxy.upgrade();}
}

输出结果:

--->开始玩游戏前,教练指导战术!
张三已登陆游戏!
张三正在刷怪!
恭喜升级!
--->游戏结束,教练总结经验!

4.动态代理

根据如上的介绍,你会发现每个代理类只能为一个接口服务,这样程序开发中必然会产生许多的代理类
所以我们就会想办法可以通过一个代理类完成全部的代理功能,那么我们就需要用动态代理

在上面的示例中,一个代理只能代理一种类型,而且是在编译器就已经确定被代理的对象。而动态代理是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象

JDK动态代理
目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

还是上面的例子用动态代理实现:

public interface IGamePlayer {/** 登陆游戏*/public void login();/** 杀怪*/public void killBoss();/** 升级*/public void upgrade();
}
public class GamePlayer implements IGamePlayer{String name;public GamePlayer(String name) {this.name = name;}@Overridepublic void login() {System.out.println(name+"已登陆游戏!");}@Overridepublic void killBoss() {System.out.println(name+"正在刷怪!");}@Overridepublic void upgrade() {System.out.println("恭喜升级!");}}
public class GamePlayProxy implements InvocationHandler{/** 腰代理的真实对象*/private Object obj;public GamePlayProxy(Object obj) {this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;//调用之前//doBefore();//调用原始对象的方法result=method.invoke(obj, args);//调用之后//doAfter();return result;}}
public class App {public static void main(String[] args) {GamePlayer gamePlayer = new GamePlayer("张三");GamePlayProxy proxy = new GamePlayProxy(gamePlayer);IGamePlayer gamePlayProxy = (IGamePlayer) Proxy.newProxyInstance(GamePlayer.class.getClassLoader(),GamePlayer.class.getInterfaces(), proxy);gamePlayProxy.login();gamePlayProxy.killBoss();gamePlayProxy.upgrade();}
}

结果:
这里写图片描述

CGLIB动态代理

/** 目标对象*/
public class Train {public void start(){System.out.println("火车开始启动......");}
}
public class Cglibproxy implements MethodInterceptor{private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz){//设置创建子类的类enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}/** 拦截所有目标类方法的调用* obj 目标类的实例* m 目标方法的反射对象* arge 方法的参数、* proxy 代理类的实例*/@Overridepublic Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable {//代理类调用父类方法proxy.invokeSuper(obj, args);return null;}}
/** 客户端*/
public class App {public static void main(String[] args) {Cglibproxy proxy = new Cglibproxy();Train t = (Train) proxy.getProxy(Train.class);t.start();}
}

显然:动态代理不仅仅只能代理一种类。

JDK代理和cglib代理简单比较:
JDK动态代理
1.只能代理实现了接口的类
2.没有实现接口的类不能实现JDK动态代理

CGLIB动态代理
1.针对类来实现动态代理
2.对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的使用。


http://chatgpt.dhexx.cn/article/XTh8Lpi1.shtml

相关文章

代理模式的使用

一.代理模式 代理模式是java常用的设计模式。 代理的定义:为其他对象提供一种代理以控制对这个对象的访问。 简单点说就是代理对象与实际对象都实现了相同的接口,我们可以通过代理对象来间接的访问实际对象,也因为这种间接性,我…

C++之代理模式

目录 模式思想 简介 组成 优点 代码实现 情景 如果不使用代理的话: 加代理的话: 结果 模式思想 简介 代理模式: 通过代理类,来控制实际对象的访问权限。 在某些情况下,一个对象不适合或者不能直接引用另…

代理模式与动态代理模式

原文地址:点击打开链接 1、代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。 代理模…

设计模式之代理模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、代理模式是什么? 代理模式是一种结构型的软件设计模式,在不改变原代码前提下,提供一个代理…

动态代理模式详解

目录 (一)什么是动态代理模式 (二)动态代理模式入门案例 1.完成一个账户转账的功能 2. v1.0版本为转账添加一个事务 3.v2.0将事务从业务层和从持久层剥离 4.v3.0将事务使用动态代理完成 5.v3.0通过cglib实现代理模式 &…

三种代理模式详解

文章目录 二、代理模式(Proxy Pattern)1、常见的几种代理模式:2、静态代理3、JDK动态代理4、CGLib代理5、CGLib和JDK动态代理的区别 二、代理模式(Proxy Pattern) 根据B站狂神视频整理:https://www.bilibil…

Spring的代理模式

1、代理模式 为什么要学习代理模式? 因为这就是springAOP的底层!【springAOP和springMVC】 代理模式的分类: 静态代理动态代理 1.1、静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决真实角色&…

代理模式(Proxy模式)详解

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保…

代理模式的详细介绍

国庆期间闲来无事,写了一个简单的小程序,小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料,方面大家查找使用,包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发…

代理模式

代理模式 代理模式应用场景模式结构实现方式 代理模式 控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。 优点: 在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;代理对象可以扩展目标对象的功能&#x…

代理模式详解

1. 代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式一半包含三种角色&#x…

代理模式详细讲解

文章目录 一、什么是代理模式?二、 为什么使用代理模式?三、 代理模式的实现1、静态代理1.1、 创建公共的接口1.2、 创建被代理角色1.3、 创建代理角色1.4、 创建测试类 2、动态代理的实现2.1、 使用 JDK 的 Proxy 类实现动态代理1、 创建业务接口2、 创…

一文搞懂代理模式

代理模式 前言一、代理模式是什么?二、静态代理三、动态代理1.jdk动态代理(接口代理)2.cglib动态代理 前言 一、代理模式是什么? 代理模式是常见的设计模式之一,顾名思义,代理模式就是代理对象具备真实对象…

手机测试耳机音质的软件,耳机音质测试软件有哪些

耳机音质测试软件并不存在,因为耳机的音质对于人来说是主观的,你认为音质好的耳机,有的人却并不认为也很正常,国内外都没有恒定的耳机音质评判标准,大多数人认为音质好的耳机,那么它十有八九实际就是好的。…

软件测试的基本理论与方法

文章目录 前言软件测试基础1. 软件测试的概念2. 软件测试的目的 测试用例1. 测试用例的概念2. 测试用例的分类3. 测试用例的治理4. 测试用例的编制及使用5. 测试需求 软件生命周期1. 问题的定义及规划2. 需求分析3. 软件设计4. 程序编码5. 软件测试6. 运行维护7. 生命周期模型 …

固态硬盘测试软件有哪些,SSD测试软件有哪些?SSD测试软件盘点

在购买了固态硬盘(SSD)后,如果对商家或官方给出的诸如读写速度等关键性数据存在质疑的话,最好的解决方法莫过于通过SSD测试软件来找寻答案。那么,SSD测试软件有哪些?SSD测试软件哪个比较好用呢?针对上述问题&#xff0…

软件工程-软件测试-测试方法

软件工程-测试方法-白盒和黑盒测试 软件工程-软件测试 软件测试方法可以分为静态测试和动态测试。 静态测试 静态测试是指被测试程序不在程序上运行,而是采用人工检测和计算机辅助金泰分析的手段对程序进行检测。 静态测试方法 (1)人工检…

软件测试方法和技术有哪些?

软件测试方法和技术有哪些?包括软件测试基础、软件测试方法、软件测试流程和规范、单元测试与集成测试、系统测试、验收测试、软件本地化测试、测试自动化及其框架、白盒测试和黑盒测试等。 软件测试方法技术   软件测试方法: 一、等价类测试方法的…

软件测试方法汇总 - 从不同角度分析软件测试方法有哪些

1、从是否关心内部结构来看 (1)白盒测试:又称为结构测试或逻辑驱动测试,是一种按照程序内部逻辑结构和编码结构,设计测试数据并完成测试的一种测试方法。 (2)黑盒测试:又称为数据驱…

常见的软件测试方法有,常见的几种软件测试方法都有哪些

随着互联网的不断发展,越来越多的人也都开始学习软件测试的相关技术,而今天我们就一起来了解一下,常见的几种软件测试方法都有哪些。 1、单元测试 单元测试测试的是代码库的单元。 它们直接调用函数或单元,并确保返回正确的结果。…