设计模式 - 代理(proxy)

2024-08-20 15:52
文章标签 设计模式 代理 proxy

本文主要是介绍设计模式 - 代理(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 类:客户端代码,展示了如何使用代理来延迟加载图像。

优点

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

缺点

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

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

这篇关于设计模式 - 代理(proxy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090503

相关文章

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

proxy代理解决vue中跨域问题

vue.config.js module.exports = {...// webpack-dev-server 相关配置devServer: {host: '0.0.0.0',port: port,open: true,proxy: {'/api': {target: `https://vfadmin.insistence.tech/prod-api`,changeOrigin: true,p

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起来你遇到了典型的代码复用和维护问题。你有没有听说过“模板方法模式”? 菜鸟:模板方法模式?没听过。这是什么? 老鸟:简单来说,模板方法模式让你在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,你可

漫谈设计模式 [9]:外观模式

引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构? 菜鸟:设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢? 老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

设计模式大全和详解,含Python代码例子

若有不理解,可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是设计模式的简要介绍和 Python 代码示例,涵盖主要的创建型、结构型和行为型模式。 一、创建型模式 1. 单例模式 (Singleton

漫谈设计模式 [6]:适配器模式

引导性开场 菜鸟:老鸟,我最近在项目中遇到一个问题,我们的系统需要集成一个新的第三方库,但这个库的接口和我们现有的代码完全不兼容。我该怎么办? 老鸟:这是个常见的问题,很多开发者都会遇到这种情况。你有没有听说过适配器模式? 菜鸟:适配器模式?没有,能详细说说吗? 老鸟:当然可以!这就是我们今天要讨论的主题。适配器模式是一个设计模式,可以帮助我们解决你现在遇到的问题。 渐进式介绍概念 老

2 观察者模式(设计模式笔记)

2 观察者模式(别名:发布-订阅) 概念 定义对象间的一种一对多的依赖关系,当一个对象状态发生变化时,所以依赖于它的对象都得到通知并被自动更新。 模式的结构与使用 角色 主题(Subject)观察者(Observer)具体主题(ConcreteSubject)具体观察者(ConcreteObserver) 结构 Subject依赖于Observer最重要!!! package