新数据结构(12)——代理

devtools/2025/2/22 4:18:30/

什么是代理

在进行操作时有时不希望用户直接接触到目标,这时需要使用代理让用户间接接触到目标

给目标对象提供一个代理对象,并且由代理对象控制着对目标对象的引用

图解:

代理的目的

控制访问:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性

功能增强:通过代理业务对原有业务进行增强

静态代理

如下代码是代理实例,并且实现控制访问

实现功能增强

 静态代理的缺点:当目标类增多的时候,代理类直接增加代理的目标类,会造成代理逻辑混乱

动态代理

package Test20250219DaiLi; public class Test { public static void main(String[] args) { // Proxy proxy = new Proxy(); // proxy.clothes("xxxL"); ClothesFactory clothesFactory = new ClothesFactory(); ByClothes clothes = (ByClothes) new DyProxy(clothesFactory).getProxyInterFace(); clothes.clothes("XXXL"); ShootFactory shootFactory = new ShootFactory(); ByShoot shoot= (ByShoot) new DyProxy(shootFactory).getProxyInterFace(); shoot.Shoot("42"); } }

package Test20250219DaiLi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DyProxy implements InvocationHandler { //被代理的对象 //代理对象如何得知自己代理的是哪个目标类 //这里这样写其实是让用户告诉我,我要代理谁 private Object o ; public DyProxy(Object o){ this.o = o; } //2.获取目标类的接口,要知道自己代理的核心方法是啥? public Object getProxyInterFace(){ return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(),this); } //知道了接口----》变相得知了自己要代理的核心方法: //invoke方法是利用反射的方式获取到了要代理的核心方法 //1.Object:jdk创建的代理类,无需赋值 //2.Method:目标类当中的方法,jdk提供,无需赋值 //3.Object[]:目标类当中的方法的参数,jdk提供,无需赋值 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { FrontService(); method.invoke(o,args); endService(); return null; } //前置服务 public void FrontService() { System.out.println("根据您的需求进行市场调研"); } //前置服务 public void endService() { System.out.println("为您提供一条龙的包办服务"); } }

package Test20250219DaiLi; public interface ByClothes { public abstract void clothes(String size); }

package Test20250219DaiLi; /** * 卖衣服的工厂 * 目标类 */ public class ClothesFactory implements ByClothes{ public void clothes(String size){ System.out.println("已经给您定制好了一件大小为"+size+"的衣服"); } public void 机器处理(){ } public void 原材料(){} }


http://www.ppmy.cn/devtools/160860.html

相关文章

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …

yolo11s rknn无法detect的bugfix - step by step

1.缘起 上周四下班时,发现在宿主机环境工作良好的既有的pytorch模型,在通过.pt->.onnx->.rknn的转换后无法正常工作。周五下班时,怀疑疑点在两处: 版本匹配问题通道和参数传递问题。 周六,周日,周…

常用的 React Hooks 的介绍和示例

目录 1. useState2. useEffect3. useContext4. useReducer5. useCallback6. useMemo7. useRef8. useImperativeHandle9. useLayoutEffect10. useDebugValue 常用的 React Hooks 的介绍和示例: 1. useState useState 是一个用于在函数组件中添加状态的 Hook。 impo…

pdf-extract-kit paddle paddleocr pdf2markdown.py(效果不佳)

GitHub - opendatalab/PDF-Extract-Kit: A Comprehensive Toolkit for High-Quality PDF Content Extraction https://github.com/opendatalab/PDF-Extract-Kit pdf2markdown.py 运行遇到的问题: 错误: -------------------------------------- C Tra…

【Mysql】我在广州学Mysql 系列—— 有关日志管理的示例

ℹ️大家好,我是练小杰,今天星期四了,明天周五,美好的周末又要到了!!😆 本文是对MySQL日志管理内容进行练习,后续将添加更多相关知识噢,谢谢各位的支持🙏 复习…

【C++项目】Rpc通信框架设计

目录 Rpc远程调用的思想 项目框架设计 服务端模块划分 网络通信模块 Network 应用层通信协议模块 Protocol 消息分发处理模块 Dispatcher 远程调用路由功能模块 RpcRouter ​编辑 发布订阅功能模块 Publish-Subscribe 服务注册/发现/上线/下线功能模块 Registry-Disc…

安卓携手电脑,畅享局域网手机投屏全屏新体验

软件介绍 今天给大家推荐一款超实用的局域网手机投屏电脑的神器。它能让手机画面在电脑上全屏显示,效果超赞! 这款软件分安卓端和电脑端,两边都得安装相应软件才能实现投屏功能。就拿 Windows 系统来说,对应的软件叫 Macast&…

软件评测师复习之计算机网络(4)

目录 (一)1.网络功能和分类2.OSI七层模型3.TCP/IP协议4.传输介质(二)1.通信方式和交换方式2.IP地址3.IPv64.网络规划与设计5.磁盘冗余阵列6.网络存储技术(一) 1.网络功能和分类 计算机网络功能:数据通信、资源共享、负载均衡、高可靠性 按分布范围和拓扑结构划分: 网络分类…