Java设计模式学习之代理模式

news/2024/10/22 18:18:55

代理模式


目录
  • 代理模式
    • 代理模式的主要角色包括:
    • 代理模式的几种类型:
    • 应用场景:
    • 优点:
    • 缺点:

代理模式(Proxy Pattern)是结构型设计模式之一,它为其他对象提供一个代理对象以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。这种模式在实际编程中非常常见,它可以帮助我们控制对资源的访问,提高系统的灵活性和安全性。

代理模式的主要角色包括:

  1. Subject(主题接口):定义了真实对象和代理对象共有的接口,这样代理可以用来代替真实对象。
  2. Real Subject(真实主题):定义了代理所代表的真实对象,实现了主题接口。
  3. Proxy(代理主题):包含了对真实主题的引用,实现了与真实主题相同的接口,并在访问真实主题之前或之后添加额外的处理。

代理模式的几种类型:

  1. 静态代理:在代码编译时就已经确定代理类和目标类的关系。
  2. 动态代理:在程序运行时,通过反射机制动态创建代理类。

应用场景:

  1. 访问控制:在访问某个对象之前,可能需要进行权限检查或验证。代理模式可以在访问真实对象之前进行这些检查。
  2. 延迟初始化:如果创建对象的成本很高,可以使用代理模式来延迟对象的创建,直到真正需要时才创建。
  3. 日志记录:在访问对象的操作前后添加日志记录,而不需要修改对象本身的代码。
  4. 缓存:代理模式可以用来实现对象的缓存,以提高性能。
  5. 远程代理:为位于不同地址空间的对象提供局部代表,隐藏对象存在于不同地址空间的事实。
  6. 虚拟代理:根据需要创建开销很大的对象,例如复杂的图形对象。
  7. 保护代理:控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。
  8. 智能引用:在访问对象时执行额外的动作,比如引用计数、加载持久对象到内存等。

优点:

  • 安全性:可以控制对原始对象的访问。
  • 延迟初始化:只有在需要时才创建对象,节省资源。
  • 扩展性:可以在不修改原始对象的情况下,通过代理添加额外的功能。

缺点:

  • 复杂性:增加了系统的复杂性,因为需要额外的代理类。
  • 性能:可能因为代理的额外处理而影响性能。
// 定义一个接口  
interface Subject {  void request();  
}  // 实现了Subject接口的真实对象  
class RealSubject implements Subject {  @Override  public void request() {  System.out.println("RealSubject: Handling request.");  }  
}  // 客户端代码  
public class NoProxyDemo {  public static void main(String[] args) {  // 直接创建并使用真实对象来处理请求  Subject realSubject = new RealSubject();  realSubject.request();  }  
}

使用代理模式后:

// 定义一个接口  
interface Subject {  void request();  
}  // 实现了Subject接口的真实对象  
class RealSubject implements Subject {  @Override  public void request() {  System.out.println("RealSubject: Handling request.");  }  
}  // 实现了Subject接口的代理类  
class Proxy implements Subject {  private RealSubject realSubject;  // 在需要时,代理类可以延迟创建真实对象  @Override  public void request() {  if (realSubject == null) {  realSubject = new RealSubject();  }  // 直接调用真实对象的方法,这里没有添加额外处理逻辑  realSubject.request();  }  
}  // 客户端代码  
public class SimpleProxyDemo {  public static void main(String[] args) {  // 使用代理类来处理请求  Subject proxy = new Proxy();  proxy.request();  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74733.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【八叉树】从上千万个物体中【**瞬间**】就近选取坐标

众里寻他千百度,蓦然回首,那人却在灯火阑珊处前情提要 在某些情况下,我们在场景中创建了数百万个物体,这些物体没有直接的网格或碰撞体(例如,通过GPU绘制的物体),因此无法通过常规的射线检测与碰撞体进行交互。我们仅掌握这些物体的坐标或顶点位置。在这种情况下,我们…

Python 数据分析与可视化有什么区别

在当今的数据驱动时代,Python已成为数据分析和数据可视化的重要工具。尽管这两个领域经常在数据科学项目中相互交织,但它们在功能和目的上存在本质区别。本文旨在详细探讨Python在数据分析和数据可视化方面的差异,包括它们的定义、使用的主要库、应用场景以及在实际项目中的…

python第六章课后习题

点击查看代码print("学号:2023310143028")点击查看代码def prim(graph, start): num_nodes = len(graph) visited = [False] * num_nodes min_heap = [(0, start, -1)] mst_cost = 0 mst_edges = [] while min_heap: weight, u, parent = heapq.heappop(min…

go1.18版本下 beego/bee安装无法生成exe问题已解决

转自: https://www.cnblogs.com/leijiangsheng/p/17392795.html 我原来的项目是教育学习APP使用gin框架,很多东西都是自己原来实现的。最近开发小程序,需要重新独立后台,又重新找了下go框架研究了下,beego确实是个好框架,至少项目能用到的都考虑进去了。 然后发现我本地装…

哈希碰撞

问:两个字符串hashcode相同equals一定相同吗?equals相同hashcode一定相同吗? 答:equals相同hashcode一定相同,hashcode因为哈希碰撞所以equals不一定相同。 Hash如何存数据hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。 如下图:这里的学号是个key,哈希表…

实景三维助力智慧水利建设

随着信息技术的快速发展,智慧水利作为智慧城市的重要组成部分,正受到越来越多的关注。实景三维技术,以其独特的优势,为智慧水利建设提供了强有力的支撑。本文将探讨实景三维技术如何助力智慧水利建设。一、智慧水利建设的背景智慧水利是指运用现代信息技术,对水利设施进行…

python第四章课后习题

点击查看代码 import numpy as np import cvxpy as cpx=cp.Variable(6,pos=True) obj=cp.Minimize(x[5]) a1=np.array([0.025, 0.015, 0.055, 0.026]) a2=np.array([0.05, 0.27, 0.19, 0.185, 0.185]) a3=np.array([1, 1.01, 1.02, 1.045, 1.065]) k=0.05; kk=[]; qq=[] while …

Go语言net/http包源码学习

0.前言 该笔记为笔者第一次学习go的net/http包源码的时候所记,也许写的并不是很精确,希望大家多多包涵,一起讨论学习。 该笔记很大程度的参考了网名为“小徐先生”的前辈所分享的博客,推荐大家可以先看一看它的博客来一起学习,我的只是照葫芦画瓢还有一些代码更新的讲解而…