定义
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
馒头杂谈
首先代理的概念在生活中非常常见,例如我们平时购买商品,都是通过专卖店或者一些品牌店来购买,而不是直接去工厂。例如设计部来了一个美女同事,你让你之前的设计部好友帮你打探打探(后来他们在一起了),例如某一天不知不觉你的朋友在朋友圈开始了"代理"之路(面膜面膜~~@@##$#%$##$).这些和我们的代理模式都是很相似的。
基本简介
(1)抽象角色(Subject)
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
(2)真实角色(RealSubject)
也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。
(3)代理角色(Proxy)
也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
UML图
示例
我们按照UML图来做一个简单的例子进行初步体验
(1.1)抽象主题类Subject
/// <summary> /// 抽象角色 /// </summary> public abstract class Subject { //抽象方法 public abstract void Request(); }
(1.2)真实主题类RealSubject
/// <summary> /// 真实主题 /// </summary> public class RealSubject : Subject { /// <summary> /// 重写父类的方法 /// </summary> public override void Request() { Console.WriteLine("真实的主题"); } }
(1.3)代理Proxy
在代理类中我们可以根据实际情况进行一些处理,下边的begin_Request()和end_Request()就是一个预留
/// <summary> /// 代理类 /// </summary> public class Proxy : Subject { //持有的主题的对象 private RealSubject _subject = null; public override void Request() { //0.1请求开始 this.begin_Request(); //0.2处理 if (_subject == null) _subject = new RealSubject(); _subject.Request(); //0.3善后处理 this.end_Request(); } #region 加入我们自己的逻辑处理方法 /// <summary> /// 开始请求 /// </summary> public void begin_Request() { Console.WriteLine("..begin request"); } /// <summary> /// 结束请求 /// </summary> public void end_Request() { Console.WriteLine("..end request"); } #endregion }
(1.4)客户端调用
class Program { static void Main(string[] args) { //代理类 Proxy proxy = new Proxy(); proxy.Request(); Console.ReadKey(); } }
(1.5)测试结果
(1.6)小结:
我们的测试例子已经结束,这种偏向于静态代理,大家能看到静态代理中一个真是角色必须对应一个代理角色,很纯粹,代理对象代理真实对象所要做的事情,可以添加一些辅助方法,但是这种情况大量使用,会导致对应多个代理产生多个代理角色,导致类的臃肿。所以出现了动态代理,我们会在后边的文章慢慢了解,谢谢大家。