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

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

什么是代理

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

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

图解:

代理的目的

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

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

静态代理

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

实现功能增强

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

动态代理

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.lryc.cn/news/540318.html

相关文章:

  • 记一次一波三折的众测SRC经历
  • Laravel从入门到上云
  • 【小游戏】C++控制台版本俄罗斯轮盘赌
  • 【前端】使用WebStorm创建第一个项目
  • 前后端项目部署服务器(传统部署和Docker部署)
  • C++,设计模式,【工厂方法模式】
  • golang--字符串处理(rune类型)
  • 如何通过AI优化敏捷开发中的任务管理与分配?
  • 第1章大型互联网公司的基础架构——1.11 消息中间件技术
  • FlutterAssetsGenerator插件的使用
  • EasyExcel 自定义头信息导出
  • 网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施
  • 【系列专栏】银行IT的云原生架构-存储架构-数据库部署 10
  • Python 爬虫selenium
  • 为啥vue3设计不直接用toRefs,而是reactive+toRefs
  • 深入解析 vLLM:高性能 LLM 服务框架的架构之美(二)调度管理
  • VMware安装教程
  • iOS事件传递和响应
  • TensorFlow 实现任意风格的快速风格转换
  • 火绒终端安全管理系统V2.0【系统防御功能】
  • 全志A133 android10 适配SLM770A 4G模块
  • 第3章 3.2 配置系统 .NET Core配置系统
  • 装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住
  • Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
  • NLP-RNN-LSTM浅析
  • 【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记
  • 臻识相机,华夏相机,芊熠车牌识别相机加密解密
  • 一个前端,如何同时联调多个后端
  • 向量的点乘的几何意义
  • 如何组织和管理JavaScript文件:最佳实践与策略