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

代理模式【Proxy Pattern】

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
举例子:
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理
类图如下

(1).静态代理

  1. 定义同一种类型的接口
  2. 定义同一种类型接口的实现
  3. 定义代理类

 1.先定义一种类型的女人:

package proxy;/*** * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:43*/
public interface KindWomen {/*** 抛媚眼*/public void makeEyesWithMan();/*** 开心约会*/public void happyWithMan();}

2.实现接口

package proxy;/*** 潘金莲** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:45*/
public class PanJinLian implements KindWomen {@Overridepublic void makeEyesWithMan() {System.out.println("潘金莲抛媚眼");}@Overridepublic void happyWithMan() {System.out.println("潘金莲和男人开心约会");}
}

3.定义代理类

package proxy;/*** 代理类* 王婆(帮忙给西门庆代理)** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:46*/
public class WangPo implements KindWomen {private KindWomen kindWomen;/*** 王婆默认就是潘金莲的代理*/public WangPo() {this.kindWomen = new PanJinLian();}/*** 王婆可以代理这个类型的所有人** @param kindWomen*/public WangPo(KindWomen kindWomen) {this.kindWomen = kindWomen;}@Overridepublic void makeEyesWithMan() {//实际做事的是代理类this.kindWomen.makeEyesWithMan();}@Overridepublic void happyWithMan() {//实际做事的是代理类this.kindWomen.happyWithMan();}
}

4.找到代理类进行调用

package proxy;/*** 西门庆** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:50*/
public class XiMenQing {public static void main(String[] args) {System.out.println("(1)静态代理******************");//西门庆找到王婆,然后王婆就作为代理,帮忙安排了和潘金莲的约会WangPo wangPo = new WangPo();//王婆默认的代理就是潘金莲wangPo.makeEyesWithMan();wangPo.happyWithMan();//传参数执行WangPo wangPo2 = new WangPo(new PanJinLian());wangPo2.makeEyesWithMan();wangPo2.happyWithMan();System.out.println("(2)动态代理******************");KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();System.out.println("生成的代理对象"+kindWomen.getClass());kindWomen.makeEyesWithMan();kindWomen.happyWithMan();}
}

(2).动态代理

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:58*/
public class ProxyFactory {//维护一个目标对象 , Objectprivate Object target;//构造器 , 对target 进行初始化public ProxyFactory(Object target) {this.target = target;}//动态生成一个代理对象public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() { //匿名类重写invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理开始");Object returnVal = method.invoke(target, args);//反射机制调用目标对象的方法System.out.println("动态代理结束");return returnVal;}});}
}

执行结果如下:

http://www.lryc.cn/news/123936.html

相关文章:

  • Oracle切割字符串的方法,SQL语句完成。
  • Https、CA证书、数字签名
  • Jmeter-压测时接口按照顺序执行-临界部分控制器
  • linux 文件权限识别及其修改
  • Java:简单算法:冒泡排序、选择排序、二分查找
  • C、C++项目中 configure、makefile.am、makefile.in、makefile 之间的关系
  • 【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)
  • 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
  • ArcGIS Maps SDK for JavaScript系列之一:在Vue3中加载ArcGIS地图
  • 服务器扩展未生效
  • Jenkins构建自由风格项目发布jar到服务器
  • Rabbitmq延迟消息
  • miniExcel 生成excel
  • Handler详解
  • Feign忽略Https的SSL最佳方案(且保证负载均衡将失效)
  • Neo4j之SET基础
  • Redis 缓存过期及删除
  • 万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)
  • 【左神算法刷题班】第17节:在有序二维数组中查找目标值、等于目标字符串的子序列个数
  • 【Terraform学习】本地变量(Terraform配置语言学习)
  • zabbix自动注册服务器以及部署代理服务器
  • 掌握Python的X篇_32_使用python编辑pdf文件_pdfrw
  • 【软件工程】软件测试
  • Android性能优化——内存优化
  • Android Studio实现图形验证码
  • JAVA面试数据库篇
  • Android高手进阶教程(三)之----Android 中自定义View的应用.
  • 第一百一十三回 dart中的getter/setter方法
  • 搭建Docker环境
  • 微服务08-多级缓存