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

设计模式 - 代理(proxy)

介绍

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于延迟加载、访问控制、日志记录、性能监控等场景。

概述

代理模式的核心思想是通过代理对象来控制对真实对象的访问。代理对象实现与真实对象相同的接口,因此它可以代替真实对象来处理请求,并在适当的情况下将请求转发给真实对象。

根据功能和应用场景的不同,代理模式可以分为几种常见的类型:

  1. 远程代理(Remote Proxy):为一个位于不同地址空间的对象提供局部代表,以便隐藏实际对象所在的远程地址空间的细节。
  2. 虚拟代理(Virtual Proxy):用于控制对资源开销较大的对象的访问,通过延迟实例化来提高性能。
  3. 保护代理(Protection Proxy):控制对目标对象的访问,根据权限限制调用者对对象的操作。

应用场景

  1. 延迟加载:例如,在Web应用中延迟加载大型图像或数据,直到它们真正被需要时才进行加载。
  2. 访问控制:在某些场景下,限制对对象的访问权限,如用户权限管理。
  3. 日志记录或调试:在访问真实对象时,添加一些额外的操作,如日志记录或性能监控。
  4. 远程访问:代理模式可以隐藏网络的复杂性,让本地应用访问远程服务就像访问本地服务一样。

示例代码

以下是代理模式的一个简单示例,展示了如何使用虚拟代理来延迟加载一个图像。

示例:虚拟代理

假设我们有一个 Image 接口和一个 RealImage 类用于加载和显示图像。为了优化性能,我们可以使用代理模式在图像真正需要显示时才去加载它。

// 定义一个图像接口
interface Image {void display();
}// 真实的图像类,负责加载和显示图像
class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadImageFromDisk();}private void loadImageFromDisk() {System.out.println("Loading image from disk: " + filename);}@Overridepublic void display() {System.out.println("Displaying image: " + filename);}
}// 图像代理类,控制对 RealImage 的访问
class ImageProxy implements Image {private RealImage realImage;private String filename;public ImageProxy(String filename) {this.filename = filename;}@Overridepublic void display() {if (realImage == null) {realImage = new RealImage(filename);  // 延迟加载图像}realImage.display();}
}// 使用客户端代码
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ImageProxy("test_image.jpg");// 图像首次显示时才加载System.out.println("Image will be loaded only when display is called for the first time:");image.display();// 图像已加载,不再重复加载System.out.println("\nDisplaying image again:");image.display();}
}

代码解析

  1. Image 接口:定义了图像的行为(例如 display() 方法)。
  2. RealImage 类:是真实的图像类,负责从磁盘加载和显示图像。
  3. ImageProxy 类:代理类,实现了 Image 接口,通过在 display() 方法中控制对 RealImage
    的访问,延迟加载图像。
  4. ProxyPatternDemo 类:客户端代码,展示了如何使用代理来延迟加载图像。

优点

  • 控制对象访问:代理可以在不改变原有类的情况下控制对类的访问。
  • 降低开销:虚拟代理可以延迟加载资源,减少不必要的开销。
  • 增强安全性:保护代理可以控制访问权限,增强安全性。

缺点

  • 增加复杂性:增加了代码的复杂性,因为需要定义额外的代理类。
  • 性能开销:虽然代理模式可以减少不必要的资源开销,但引入代理也会带来一定的性能开销,尤其是当代理逻辑复杂时。

代理模式在现实开发中非常常见,特别是在涉及到性能优化、安全控制等场景时,是一种非常实用的设计模式。


http://www.mrgr.cn/news/3548.html

相关文章:

  • CSS小玩意儿:文字适配背景
  • JavaScript语法基础之DOM基础
  • 【html+css 绚丽Loading】 - 000010 三才定星轮
  • PyTorch 基础学习(10)- Transformer
  • 代码随想录算法训练营第五十四天 | 110. 字符串接龙、105. 有向图的完全可达性、106.岛屿的周长
  • 裸金属服务器和裸金属云服务器:区别、优势与选择
  • 昇腾 - AscendCL C++应用开发 线程安全的队列
  • 【Dash】Dash中@callback() 回调函数的Output() 参数
  • Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录
  • java-带三方包的cmd命令打包(在同一个包下的场景)
  • 【计算机病毒与木马中的Ring1、Ring2、Ring3是什么意思?】
  • 思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”
  • Trie树、Radix树
  • Pandas与Excel的常用操作对比
  • 关于uniapp使用izExif.js 插件问题
  • redis内存溢出排查
  • Vue 3 组件渲染“暂停”技巧
  • Proxy/Skeleton
  • HTTP 之 HTTP/1.1 连接特性(五)
  • MYSQL定时任务使用手册