11代理模式Proxy
2023-09-27 14:25:08 时间
一、什么是代理模式
Proxy模式又叫做代理模式,是构造型的设计 模式之一,它可以为其他对象提供一种代理(Proxy)以 控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有 相同的接口的类,客户端必须通过代理与被代理的目标 类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
二、代理模式的结构
三、代理模式的角色和职责
subject(抽象主题角色): 真实主题与代理主题的共同接口。
RealSubject(真实主题角色): 定义了代理角色所代表的真实对象。
Proxy(代理主题角色): 含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。
四、动态代理
1. InvocationHandler 接口 2. invoke方法 3. Proxy.newProxyInstance();
没用代理模式
主题
1 //主题 2 public interface Subject { 3 public void sailBook(); 4 }
现实主题
1 //现实主题 2 public class RealSubject implements Subject { 3 4 public void sailBook() { 5 System.out.println("卖书"); 6 } 7 }
代理主题
1 //代理主题 2 public class ProxySubject implements Subject{ 3 private RealSubject realSubject; 4 5 public void sailBook() { 6 dazhe(); 7 if(realSubject == null) { 8 realSubject = new RealSubject(); 9 } 10 realSubject.sailBook(); 11 give(); 12 } 13 14 public void dazhe() { 15 System.out.println("打折"); 16 } 17 18 public void give() { 19 System.out.println("赠送代金券"); 20 } 21 }
测试
1 public class MainClass { 2 public static void main(String[] args) { 3 ProxySubject proxySubject = new ProxySubject(); 4 proxySubject.sailBook(); 5 } 6 }
==============================================================
使用代理模式
主题
1 //主题 2 public interface Subject { 3 public void sailBook(); 4 }
真实主题
1 //真实主题 2 public class RealSubject implements Subject { 3 4 public void sailBook() { 5 System.out.println("卖书"); 6 } 7 }
My处理程序 实现 调用处理程序
1 public class MyHandler implements InvocationHandler { 2 private RealSubject realSubject; 3 4 public void setRealSubject(RealSubject realSubject) { 5 this.realSubject = realSubject; 6 } 7 8 public Object invoke(Object proxy, Method method, Object[] args){ 9 Object result = null; 10 dazhe(); 11 try { 12 result = method.invoke(realSubject, args); 13 } catch (IllegalArgumentException e) { 14 e.printStackTrace(); 15 } catch (IllegalAccessException e) { 16 e.printStackTrace(); 17 } catch (InvocationTargetException e) { 18 e.printStackTrace(); 19 } 20 give(); 21 return result; 22 } 23 24 public void dazhe() { 25 System.out.println("打折"); 26 } 27 28 public void give() { 29 System.out.println("赠送代金券"); 30 } 31 }
测试
1 import java.lang.reflect.Proxy; 2 3 public class MainClass { 4 public static void main(String[] args) { 5 RealSubject realSubject = new RealSubject(); 6 MyHandler myHandler = new MyHandler(); 7 myHandler.setRealSubject(realSubject); 8 9 Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
realSubject.getClass().getInterfaces(), myHandler); 10 proxySubject.sailBook(); 11 } 12 }
相关文章
- [转]JAVA的动态代理机制及Spring的实现方式
- 设计模式-代理模式
- c#中HttpWebRequest使用代理请求
- fastcgi代理
- 网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway
- Java 代理
- Java描述设计模式(16):代理模式
- C++设计模式之代理模式
- 《众妙之门——JavaScript与jQuery技术精粹》——1.4 事件代理
- 《JavaScript设计模式》——第11章 牛郎织女——代理模式 11.1无法获取图片上传模块数据
- Nginx 反向代理配置
- Nginx反向代理配置配置实例
- 阿里云oss图片压缩访问 openresty lua header 签名 (阿里云OSS Nginx 签名代理模块)
- 浅析nginx的location匹配规则、history模式、跨域、缓存、反向代理、灰度部署、优雅降级、以目录区分多个history单文件
- JS里关于事件的常被考察的知识点:事件派发、事件流、事件广播、原生JS实现事件代理
- 重要的代理模式到底是什么
- Spring的核心AOP及代理模式(“最易懂得Spring学习”)
- 代理模式分类
- 设计模式入门之代理模式Proxy
- JAVA如何设置代理server,s取消代理erver
- 静态代理的代理模式
- 配置nginx反向代理jira并实现https
- Proxy代理模式(结构型模式)
- 免费开源的网络攻防工具集:网络资产信息扫描、端口扫描、King-Hacking黑-客工具箱、WordPress漏洞扫描、反向代理网络go-fish工具,支持绕过双因子认证