- Proxy Pattern
代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。它是一种对象结构型模式。 - Proxy角色分析
代理模式包含三个角色: - Subject (抽象主题角色): 声明了真实主题和代理主题的共同接口;
- Proxy(代理主题角色):内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象;
- RealSubject(真实主题角色):定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,
- Client:(客户端)可以通过代理主题角色间接调用真实主题角色中定义的方法。
/*
* Proxy Pattern
*/
using System;
using System.Collections.Generic;
namespace Pattern03
{
class Program
{
static void Main(string[] args)
{
// Create proxy and request a service
Proxy proxy = new Proxy();
proxy.Request();
Console.ReadKey();
}
}
/// <summary>
/// Subject abstract class
/// </summary>
abstract class Subject
{
public abstract void Request();
}
/// <summary>
/// RealSubject
/// </summary>
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("called RealSubject.Request()");
}
}
/// <summary>
/// Proxy
/// </summary>
class Proxy : Subject
{
private RealSubject _realSubject;
public override void Request()
{
// use lazy initialzation
if (_realSubject == null)
{
_realSubject = new RealSubject();
}
_realSubject.Request();
}
}
}
-
类图
-
使用场景
-
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中。
-
虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。例如:imageProxy
-
保护(Protect or Access)代理:检查调用者是否有访问权限,控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
-
缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
-代码示例2
/*
* Proxy Pattern
*/
using System;
using System.Collections.Generic;
namespace Pattern03
{
class Program
{
static void Main(string[] args)
{
// Create proxy and request a service
MathProxy mathProxy = new MathProxy();
Console.WriteLine("3+4 add: "+ mathProxy.Add(3,4));
Console.WriteLine("3-4 Sub: " +mathProxy.Sub(3,4));
Console.WriteLine("3*4 Mul: " + mathProxy.Mul(3, 4));
Console.WriteLine("3/4 Div: " + mathProxy.Div(3, 4));
Console.ReadKey();
}
}
/// <summary>
/// Subject abstract
/// </summary>
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>
/// RealSubject
/// </summary>
class Math : IMath
{
public double Add(double x, double y)
{
return x + y;
}
public double Div(double x, double y)
{
return x / y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Sub(double x, double y)
{
return x - y;
}
}
/// <summary>
/// Proxy
/// </summary>
class MathProxy : IMath
{
private Math _math= new Math();
public double Add(double x, double y)
{
return _math.Add(x, y);
}
public double Div(double x, double y)
{
return _math.Div(x, y);
}
public double Mul(double x, double y)
{
return _math.Mul(x, y);
}
public double Sub(double x, double y)
{
return _math.Sub(x, y);
}
}
}