【代理模式】
代理模式为其他队提供一种代理以控制对这个对象的访问
【介绍】
-
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因,直接访问会给使用者或者系统结构带来很多的麻烦,我们可以在访问此对象时加上一个对此对象的访问层
-
何时使用:想在访问一个类时做一些控制
-
如何解决:增加中间层
-
关键代码:实现与被代理类组合
-
优点:职责清晰、高扩展性、智能化
-
缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂
-
使用场景:1、远程代理:为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实
2、虚拟代理:根据需求创建开销很大的对象。通过它来存放实例化需求 很 长时间的真实对象
3、安全代理:用来控制真是对象访问时的权限
4、智能引用代理:当调用真实的对象时,代理处理另外一些事
-
注意事项:1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口
2、和装饰模式的区别:装饰模式增强了功能,而代理模式是为了加以控制
【实现】
Subject类,定义了RealSubject和Proxy的公用接口,这样就可以在任意使用RealSubject的地方都可以使用Proxy
步骤一:创建一个接口
abstract class Subject
{
public abstract void Request();
}
步骤二:RealSubject类,定义Proxy所代表的真实实体
class RealSubject:Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
步骤三:Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口
class Proxy:Subject
{
RealSubject realsubject;
public override void Request()
{
if (realsubject==null)
{
realsubject = new RealSubject();
}
realsubject.Request();
}
}
步骤四:客户端代码
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
【总结】