七、不同類型的代理模式
遠程代理
可以將網絡的細節隱藏起來,使得客戶端不必考慮網絡的存在。客戶完全可以認為被代理的對象是局域的而不是遠程的,而代理對象承擔了大部分的網絡通信工作,遠程代理的結構圖如下圖所示。
虛擬代理
使用虛擬代理模式的優點就是代理對象可以在必要的時候才將被代理的對象加載。代理可以對加載的過程加以必要的優化。當一個模塊的加載十分耗費資源的時候,虛擬代理的優點就非常明顯。
保護代理
保護代理可以在運行時間對用戶的有關權限進行檢查,然後在核實後決定將調用傳遞給被代理的對象。
智能引用代理
在訪問一個對象時可以執行一些內務處理(Housekeeping)操作,比如計數操作等。
八、代理模式實際應用的例子
該例子演示了利用遠程代理模式提供對另外一個應用程序域(AppDomain)的對象進行訪問控制。
// Proxy pattern -- Real World example
using System;
using System.Runtime.Remoting;
// "Subject"
public interface IMath
{
// Methods
double Add( double x, double y );
double Sub( double x, double y );
double Mul( double x, double y );
double Div( double x, double y );
}
// "RealSubject"
class Math : MarshalByRefObject, IMath
{
// Methods
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; }
}
// Remote "Proxy Object"
class MathProxy : IMath
{
// FIElds
Math math;
// Constructors
public MathProxy()
{
// Create Math instance in a different AppDomain
AppDomain ad = System.AppDomain.CreateDomain("MathDomain",null, null );
ObjectHandle o = ad.CreateInstance("Proxy_RealWorld", "Math", false,
System.Reflection.BindingFlags.CreateInstance, null, null, null,null,null );
math = (Math) o.Unwrap();
}
// Methods
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);
}
}
/**//// <summary>
/// ProxyApp test
/// </summary>
public class ProxyApp
{
public static void Main( string[] args )
{
// Create math proxy
MathProxy p = new MathProxy();
// Do the math
Console.WriteLine( "4 + 2 = {0}", p.Add( 4, 2 ) );
Console.WriteLine( "4 - 2 = {0}", p.Sub( 4, 2 ) );
Console.WriteLine( "4 * 2 = {0}", p.Mul( 4, 2 ) );
Console.WriteLine( "4 / 2 = {0}", p.Div( 4, 2 ) );
}
}