C#设计模式:代理模式(Proxy Pattern)
一,什么是C#设计模式?
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问
二,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _12.代理模式 { /// <summary> /// 代理模式提供了一个中介控制对某个对象的访问。现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理。 /// 为其他对象提供一种代理,来帮助达到目的。 /// </summary> class Program { static void Main(string[] args) { ///中国人自己买菜 Event c = new Chinese(); c.DoSomeThing(); ///代理中国人去买菜 Event e = new Proxy(); e.DoSomeThing(); e.DoSomeThing(); } } /// <summary> /// 抽象行为 /// </summary> public abstract class Event { public abstract void DoSomeThing(); } /// <summary> /// 中国人 /// </summary> public class Chinese : Event { /// <summary> /// 本来中国人要去买菜 /// </summary> public override void DoSomeThing() { Console.WriteLine("中国人,去买菜"); } } /// <summary> /// 代理模式,第三方帮忙达到目的 /// 实现AOP /// </summary> public class Proxy : Event { private Chinese chinese = null; private Chinese _chinese { get { if (this.chinese == null) chinese = new Chinese(); return chinese; } } /// <summary> /// 2 AOP:日志代理 异常代理 延迟代理 权限代理 单例代理 缓存代理 /// </summary> public bool flag = false; /// <summary> /// 代理帮忙中国人去买菜 /// </summary> public override void DoSomeThing() { Console.WriteLine("DoSomeThing start..."); ////AOP代理模式添加异常 try { if (flag) { _chinese.DoSomeThing(); } if (!flag) { ///DoSomeThing,可以在这里实现AOP(日志代理 异常代理 延迟代理 权限代理 单例代理 缓存代理) ////初始化AOP写日志,AOP写缓存 Console.WriteLine("初始化AOP写日志"); Console.WriteLine("初始化AOP写缓存"); } flag = true; } catch (Exception ex) { } Console.WriteLine("DoSomeThing end..."); } } }
三,如上很简单的代码,本来中国人去买菜,但这时是由代理帮忙买菜了,
代理模式由三部分组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。(如上:Event接口)
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(如上:Proxy)
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。(如上:Chinese)
四,代理模式和装饰者模式的区别:
1》代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能。
2》代理模式使用到极致开发就是AOP,在百科中AOP的解释:为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
3》AOP底层,就是采用动态代理模式实现的