代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色
- 抽象角色:声明真实对象和代理对象的共同接口。
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对 象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
举个栗子
/// <summary> /// 真实对象和代理对象的共同接口 /// </summary> public interface ISubject { void request(); } /// <summary> /// 真实对象 /// </summary> public class RealSubject : ISubject { public void request() { Console.WriteLine("真实对象方法"); } } /// <summary> /// 代理对象 /// </summary> public class ProxySubject : ISubject { /// <summary> /// 代理角色对象内部包含有对真实对象的引用 /// </summary> private RealSubject realSubject; public void request() { //在真实角色操作之前所附加的操作 preRequest(); if (null == realSubject) { realSubject = new RealSubject(); } //真实角色所完成的事情 realSubject.request(); //在真实角色操作之后所附加的操作 postRequest(); } /// <summary> /// 执行前方法 /// </summary> private void preRequest() { Console.WriteLine("Pre Request."); } /// <summary> /// 执行后方法 /// </summary> private void postRequest() { Console.WriteLine("Post Request"); } }
返回结果
写在最后
静态代理类图
为其他对象提供代理以控制对这个对象的访问
(例如火车票代售处代理火车站售票,提供电话预约订票等渠道,但是退票只能在火车站退)
"去掉功能服务,增加额外服务"
两种机制: 静态代理 动态代理