设计模式之美:Proxy(代理)

简介:

索引

别名

  • Surrogate

意图

为其他对象提供一种代理以控制对这个对象的访问。

Provide a surrogate or placeholder for another object to control access to it.

结构

运行时一种可能的 Proxy 结构的对象图:

参与者

Proxy

  • 保存一个引用使得代理可以访问实体。若 RealSubject 和 Subject 的接口相同,Proxy 会引用 Subject。
  • 提供一个与 Subject 的接口相同的接口,这样 Proxy 就可以用来代替实体。
  • 控制对实体的存取,并可能负责创建和删除它。
  • 其他功能依赖于 Proxy 的类型:
    • 远程代理(Remote Proxy)负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
    • 虚拟代理(Virtual Proxy)可以缓存实体的附加信息,以便延迟对它的访问。
    • 保护代理(Protection Proxy)检查调用者是否具有实现一个请求所必须的访问权限。

Subject

  • 定义 RealSubject 和 Proxy 的共用接口,这样就在任何使用 RealSubject 的地方都可以使用 Proxy。

RealSubject

  • 定义 Proxy 所代表的实体。

适用性

下面是一些使用 Proxy 模式的常见情况:

  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
  • 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。
  • 保护代理(Protection Proxy)控制对原始对象的访问。
  • 智能代理(Smart Proxy)在访问对象时执行一些附件操作。

效果

  • Proxy 模式在访问对象时引入了一定程度的间接性。
  • Proxy 模式可以对用户隐藏 Copy-On-Write 优化方式。用 Proxy 延迟对象拷贝过程,仅当这个对象被修改时才进行真正的拷贝,用以大幅度降低拷贝大实体的开销。

相关模式

  • Adapter 为它所适配的对象提供了一个不同的接口。Proxy 提供了与它的实体相同的接口
  • Decorator 的实现与 Proxy 相似,但目的不一样。 Decorator 为对象添加功能,Proxy 则控制对对象的访问。

实现

实现方式(一):使用相同 Subject 接口实现 Proxy。

对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。

复制代码
 1 namespace ProxyPattern.Implementation1
 2 {
 3   public abstract class Subject
 4   {
 5     public abstract string Name { get; }
 6     public abstract void Request();
 7   }
 8 
 9   public class ConcreteSubject : Subject
10   {
11     private string _name;
12 
13     public ConcreteSubject(string name)
14     {
15       _name = name;
16     }
17 
18     public override string Name { get { return _name; } }
19 
20     public override void Request()
21     {
22       // do something
23     }
24   }
25 
26   public class Proxy : Subject
27   {
28     private Subject _realSubject = null;
29     private string _name;
30 
31     public Proxy(string name)
32     {
33       _name = name;
34     }
35 
36     public override string Name { get { return _name; } }
37 
38     public override void Request()
39     {
40       if (_realSubject == null)
41         LoadRealSubject();
42 
43       _realSubject.Request();
44     }
45 
46     private void LoadRealSubject()
47     {
48       // do some heavy things
49       _realSubject = new ConcreteSubject(_name);
50     }
51   }
52 
53   public class Client
54   {
55     public void TestCase1()
56     {
57       Subject subject = new Proxy("SubjectName");
58       var subjectName = subject.Name;
59       subject.Request();
60     }
61   }
62 }
复制代码
目录
相关文章
|
设计模式 C#
设计模式之代理模式(Proxy)
设计模式之代理模式(Proxy)
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
276 0
|
设计模式 Java
设计模式2 - 代理模式【Proxy Pattern】
设计模式2 - 代理模式【Proxy Pattern】
91 0
|
设计模式 缓存
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
767 1
|
5月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】代理模式(Proxy)
一、入门 什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,允许你提供一个代理对象来控制对另一个对象的访问。 代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对
112 10
|
7月前
|
设计模式
课时90:代理设计模式
课时90介绍了代理设计模式,该模式通过代理对象帮助用户专注于核心业务功能。代理模式中,客户端只关注核心业务(如“吃”),而代理对象负责准备、执行和清理工作。通过接口IEat、真实主题EatReal和服务代理EatProxy的实现,展示了如何在代码中应用代理模式。代理模式的特点是将业务逻辑与辅助操作分离,使代码更清晰且易于维护。
|
8月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
130 3
|
12月前
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
127 4
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
171 0