陈巧倩

设计模式-代理模式

· 240 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

Proxy代理模式属于结构型设计模式,它允许使用代理对象来控制对实际对象的访问,并在不修改实际对象的情况下提供附加功能。

Design Pattern:Proxy 🔗

基本介绍 🔗

构成 🔗

  • Subject:抽象主题类,声明Proxy和RealSubject的公共接口,这样在使用RealSubject的任何地方都可以使用Proxy。
  • Proxy:代理类,内部含有RealSubject的引用,可以根据需要访问 RealSubject类成员。
  • RealSubject:真实主题类,定义了Proxy所代表的真实对象。

优点 🔗

  • 代理模式能够将真正被调用的对象隔离,降低了系统的耦合度。
  • 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。

缺点 🔗

  • 代码变得复杂,因为必须定义许多新类。
  • 客户端和RealSubject之间增加了一个Proxy,所以会造成请求的处理速度变慢。

分类 🔗

  • 远程代理:客户端必须使用代理类实例访问另一个网络上的远程资源。
  • 虚拟代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。
  • 保护代理:通过为客户端代码添加某种身份验证来创建资源的安全代理,资源受代理保护并且客户端代码必须通过身份验证过程。
  • 智能代理:用于添加某种功能以有效地管理资源。

实例 🔗

C#中代理模式的实例,比方说我们开发一个计算器模块。

/// <summary>
/// Subject:抽象主题类
/// </summary>
public abstract class Math
{
    public abstract double Add(double x, double y);
    public abstract double  Sub(double x, double y);
    public abstract double  Mul(double x, double y);
    public abstract double  Div(double x, double y);
}

/// <summary>
/// RealSubject:真实主题类
/// </summary>
public sealed class RealMath : Math
{
    public override double Add(double x, double y)
    {
        return x + y;
    }

    public override double Sub(double x, double y)
    {
        return x - y;
    }

    public override double Mul(double x, double y)
    {
        return x * y;
    }

    public override double Div(double x, double y)
    {
        return x / y;
    }
}

/// <summary>
/// Proxy:代理类
/// </summary>
public sealed class MathProxy : Math
{
    private RealMath _realMath = new RealMath();

    public override double Add(double x, double y)
    {
        return _realMath.Add(x, y);
    }

    public override double Sub(double x, double y)
    {
        return _realMath.Sub(x, y);
    }

    public override double Mul(double x, double y)
    {
        return _realMath.Mul(x, y);
    }

    public override double Div(double x, double y)
    {
        return _realMath.Div(x, y);
    }
}

实际运行:

MathProxy proxy = new MathProxy();
Console.WriteLine("6 + 2 = " + proxy.Add(6, 2));
Console.WriteLine("6 - 2 = " + proxy.Sub(6, 2));
Console.WriteLine("6 * 2 = " + proxy.Mul(6, 2));
Console.WriteLine("6 / 2 = " + proxy.Div(6, 2));

结论 🔗

搬砖愉快!