C# 设计模式系列教程-代理模式

2019-12-30 12:32:12王旭
代理模式对客户端来说,隐藏了真实对象的细节及复杂性,实现了客户端(调用者)与真实对象的松耦合,提高了运行速度。  

1. 概述

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

  解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题。这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合。

2. 模式中的角色

  2.1 抽象实体(Subject):定义了真实实体(RealSubject)和代理(Proxy)的公共接口,这样就在任何时候使用真实实体(RealSubject)的地方使用代理(Proxy)。

  2.2 代理(Proxy):保存一个引用使得代理可以直接访问真实实体,并提供一个与Subject的接口相同的接口,这样代理就可以代替真实实体。

  2.3 真实实体(RealSubject):定义Proxy所代表的真实实体。

3. 模式解读

  3.1 代理模式的类图

C#,设计模式,代理模式

  3.2 代理模式的代码实现

    3.2.1 抽象实体,定义真实实体与代理的公共接口


 /// <summary>
 /// 抽象实体,定义真实实体与代理的公共接口
 /// </summary>
 public interface ISubject
 {
  void Function1();
  void Function2();
 }

 

    3.2.2 真实实体,真正的功能实现者


 /// <summary>
 /// 真实实体,真正的功能实现者
 /// </summary>
 public class RealSubject:ISubject
 {

  public void Function1()
  {
   Console.WriteLine("This is the first function.");
  }

  public void Function2()
  {
   Console.WriteLine("This is the second function.");
  }
 }

    3.2.3 代理,用来控制和访问真实实体


 /// <summary>
 /// 代理,用来访问真实的实体
 /// </summary>
 public class Proxy : ISubject
 {
  /// <summary>
  /// 保存一个真实实体,用以在代理中访问真实实体的功能。
  /// </summary>
  private RealSubject realSubject;

  public Proxy()
  {
   realSubject = new RealSubject();
  }

  /// <summary>
  /// 实现与Subject相同的接口,实际调用的是RealSubject的Function1()
  /// </summary>
  public void Function1()
  {
   realSubject.Function1();
  }

  /// <summary>
  /// 实现与Subject相同的接口,实际调用的是RealSubject的Function2()
  /// </summary>
  public void Function2()
  {
   realSubject.Function2();
  }
 }