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));
结论 🔗
搬砖愉快!