代理模式
代理模式,在UML类结构上很好理解, 不过在实际应用当中可能并不是很清楚代理模式应用在哪些场景里。这里给出《大话设计模式》中对代理模式应用场合的解释:
第一,远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
第三,安全代理,用来控制真实对象访问时的权限。
第四,智能指引,是指当调用真实对象的对象时,代理处理另外一些事。(这里和动态代理类似)
我们画出动态代理的UML类结构图。
可以看出代理模式的UML类结构非常简单。
真实实体和代理共有的接口代码如下:
1 package day_7_proxy; 2 3 /** 4 * 真实实体和代理共有的接口 5 * @author turbo 6 * 7 * 2016年9月11日 8 */ 9 public interface Subject { 10 11 void request(); 12 }
真实实体和代理类代码,在真实实体中做真正要做的动作,而在代理中并不需要做真正的动作,仅仅是调用真实实体的方法动作即可。
1 package day_7_proxy; 2 3 /** 4 * 真实实体 5 * @author turbo 6 * 7 * 2016年9月11日 8 */ 9 public class RealSubject implements Subject { 10 11 /* (non-Javadoc) 12 * @see day_7_proxy.Subject#request() 13 */ 14 @Override 15 public void request() { 16 System.out.println("真实的访问"); 17 } 18 19 }
1 package day_7_proxy; 2 3 /** 4 * 代理类 5 * @author turbo 6 * 7 * 2016年9月11日 8 */ 9 public class Proxy implements Subject { 10 private RealSubject realSubject; 11 12 /* (non-Javadoc) 13 * @see day_7_proxy.Subject#request() 14 */ 15 @Override 16 public void request() { 17 if (realSubject == null){ 18 realSubject = new RealSubject(); 19 } 20 21 realSubject.request(); 22 } 23 24 }
客户端代码:
1 package day_7_proxy; 2 3 /** 4 * @author turbo 5 * 6 * 2016年9月11日 7 */ 8 public class Main { 9 public static void main(String[] args){ 10 Proxy proxy = new Proxy(); 11 proxy.request(); 12 } 13 }
这样我们就简单的实现了一个代理模式。同样也没有详细深入的讲解,在以后会结合更加实际的代码,或者开源框架代码来实际领会代理模式的威力。
Java中还有一个动态代理,后面我们会说下这个动态代理是个什么东西。
不积跬步,无以至千里;不积小流,无以成江海。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?