Proxy模式

目录
  1. 定义
  2. UML
  3. 参与者
  4. 示例
定义:

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

UML:


参与者:

抽象主题(Subject)角色:

声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替.

具体主题(RealSubject)角色:

实现抽象主题角色的具体对象。

代理主题(Proxy)角色:

含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.

示例:
using System;
 
namespace DoFactory.GangOfFour.Proxy.Structural
{
  /// <summary>
  /// MainApp startup class for Structural
  /// Proxy Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Create proxy and request a service
      Proxy proxy = new Proxy();
      proxy.Request();
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
  /// <summary>
  /// The 'Subject' abstract class
  /// </summary>
  abstract class Subject
  {
    public abstract void Request();
  }
 
  /// <summary>
  /// The 'RealSubject' class
  /// </summary>
  class RealSubject : Subject
  {
    public override void Request()
    {
      Console.WriteLine("Called RealSubject.Request()");
    }
  }
 
  /// <summary>
  /// The 'Proxy' class
  /// </summary>
  class Proxy : Subject
  {
    private RealSubject _realSubject;
 
    public override void Request()
    {
      // Use 'lazy initialization'
      if (_realSubject == null)
      {
        _realSubject = new RealSubject();
      }
 
      _realSubject.Request();
    }
  }
}

Output

Called RealSubject.Request()

实际运用:
using System;
 
namespace DoFactory.GangOfFour.Proxy.RealWorld
{
  /// <summary>
  /// MainApp startup class for Real-World
  /// Proxy Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Create math proxy
      MathProxy proxy = new MathProxy();
 
      // Do the math
      Console.WriteLine("4 + 2 = " + proxy.Add(4, 2));
      Console.WriteLine("4 - 2 = " + proxy.Sub(4, 2));
      Console.WriteLine("4 * 2 = " + proxy.Mul(4, 2));
      Console.WriteLine("4 / 2 = " + proxy.Div(4, 2));
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
  /// <summary>
  /// The 'Subject interface
  /// </summary>
  public interface IMath
  {
    double Add(double x, double y);
    double Sub(double x, double y);
    double Mul(double x, double y);
    double Div(double x, double y);
  }
 
  /// <summary>
  /// The 'RealSubject' class
  /// </summary>
  class Math : IMath
  {
    public double Add(double x, double y) { return x + y; }
    public double Sub(double x, double y) { return x - y; }
    public double Mul(double x, double y) { return x * y; }
    public double Div(double x, double y) { return x / y; }
  }
 
  /// <summary>
  /// The 'Proxy Object' class
  /// </summary>
  class MathProxy : IMath
  {
    private Math _math = new Math();
 
    public double Add(double x, double y)
    {
      return _math.Add(x, y);
    }
    public double Sub(double x, double y)
    {
      return _math.Sub(x, y);
    }
    public double Mul(double x, double y)
    {
      return _math.Mul(x, y);
    }
    public double Div(double x, double y)
    {
      return _math.Div(x, y);
    }
  }
}

Output

4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proxy模式是一种常用的设计模式,也称为代理模式。它的作用是在某个对象外部提供一个代理类,用来控制对原始对象的访问。 Proxy模式通常用于以下场景: 1. 远程访问:当客户端需要访问远程对象时,我们可以通过代理类实现远程访问。代理类接收客户端的请求,并负责将请求传递给远程对象。远程对象将处理请求并将结果返回给代理类,代理类再将结果返回给客户端。 2. 安全控制:代理类可以用来限制对原始对象的访问。代理类可以检查客户端是否有足够的权限来访问原始对象,并在必要时拒绝访问。 3. 记录日志:代理类可以用来记录对原始对象的访问。代理类可以记录每个访问的时间、客户端的IP地址、请求的参数和结果等信息,从而方便后续的跟踪和分析。 4. 延迟加载:代理类可以用来实现延迟加载。当客户端请求访问原始对象时,代理类可以先返回一个占位符,并在必要时再加载原始对象。这样可以节省系统资源,提高系统的响应速度。 5. 缓存数据:代理类可以用来实现数据缓存。当客户端请求访问某个数据时,代理类先检查缓存中是否存在该数据,如果存在则直接返回缓存数据,否则才访问原始对象并将结果放入缓存中。 总之,Proxy模式是一种非常有用的设计模式,它可以在许多场合下起到很好的作用。如果您想要提高系统的性能、安全性或可维护性,那么Proxy模式是一种不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值