代理模式的目地是为对象提供一种代理以控制对这个对象的访问。为什么会出现“通过一个代理对象,控制其他对象访问目标对象”这种场景,而不知直接new()出一个对象直接使用呢?这是因为在有些场景下对象的访问比较复杂,且需要一些额外的控制,这时如果直接new()出实例,并在调用端处理这些繁杂的细节,会增加系统的耦合。类似的场景有很多,比如远程访问、数据库访问、权限校验、负载均衡等等。
GOF对外观模式的描述为:
Provide a surrogate or placeholder for another object to control accessto it...
— Design Patterns : Elements of Reusable Object-Oriented Software
UML类图:
代理类本身也实现了ISubject接口,但在具体调用时,它会把请求转向一个RealSubject对象进行真正的处理。
代码实现:
public interface ISubject
{
string Request();
}
public class RealSubject : ISubject
{
public string Request()
{
return "From real subject";
}
//这里使用Singleton的目地是模拟复杂性,比如客户程序并不知道如何使用远端的具体类型
private static ISubject singleton = new RealSubject();
private RealSubject() { }
public static ISubject GetInstance()
{
return singleton;
}
}
public class Proxy : ISubject
{
public string Request()
{
//预处理
var result= RealSubject.GetInstance().Request();
//后处理
return result;
}
}
在代码示例中,使用Singleton模拟对象访问的复杂性,然后使用代理封装了这种复杂性,同时对访问的控制可以在预处理、后处理的部分扩展。
使用代理对象需要注意的几个问题
代理模式的优点
代理模式的缺点
参考书籍:
王翔著 《设计模式——基于C#的工程化实现及扩展》
原文:https://www.cnblogs.com/zhixin9001/p/13386392.html