设计模式之美: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 }
复制代码









目录
相关文章
|
3月前
|
设计模式 C#
设计模式之代理模式(Proxy)
设计模式之代理模式(Proxy)
|
4月前
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
|
6月前
|
设计模式 安全 Java
设计模式~代理模式(Proxy)-17
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 【跟MM在网上聊天,一开头总是“hi, 你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这
33 0
|
7月前
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
62 0
|
4月前
|
设计模式 缓存
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
|
6月前
|
设计模式 Java
设计模式2 - 代理模式【Proxy Pattern】
设计模式2 - 代理模式【Proxy Pattern】
26 0
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
5月前
|
设计模式 Java
设计模式之代理模式(静态&动态)代理
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
24 0
|
6月前
|
设计模式 缓存 Java
【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)
27 0