代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
为其它对象提供一种代理以控制对目标对象的访问。即第三方对象通过访问代理对象而达到访问目标对象之目的,与此同时,代理对象在访问目标对象前后加入特定的逻辑以实现功能的扩展
interface IProxy
{
string Function1();
string Function2();
}
远程对象实现:
/// <summary>
/// 模拟的远程对象
/// </summary>
public class LongDistanceClass:IProxy
{
#region IProxy 成员
public string Function1()
{
//do someting
return "LongDistanceClass.Function1";
}
public string Function2()
{
//do someting
return "LongDistanceClass.Function2";
}
#endregion
}
接下来就要实现代理类型,使用代理对象访问模拟的远程对象,代理类型实现如下:
public class ProxyClass:IProxy
{
#region IProxy 成员
public string Function1()
{
//to access LongDistanceClass.Function1
LongDistanceClass obj = new LongDistanceClass();
return obj.Function1();
}
public string Function2()
{
//to access LongDistanceClass.Function2
LongDistanceClass obj = new LongDistanceClass();
return obj.Function2();
}
#endregion
}
最后实现客户端代码:
class Class1
{
[STAThread]
static void Main(string[] args)
{
IProxy pro = new ProxyClass();
Console.WriteLine(pro.Function1());
Console.WriteLine(pro.Function2());
Console.Read();
}
}
运行结果如下:
LongDistanceClass.Function1
LongDistanceClass.Function2
代理模式和装饰者模式上在语法形式上几乎完全一样,那么它们的区别在哪里呢?
装饰者模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
其实,它们的着重点一个在于“增加”职责,另一个在于“控制”访问。这是它们最本质的区别。
由此可以看到:学习设计模式重点在于“语义”上把握,而不是追求它的“形式。