标签:
代理模式,就是AOP的编程,类似于中介。对某个对象的使用进行包装。这一点类似于外观模式。
代理模式和外观模式的区别是什么?
代理模式的思想是AOP编程,通过建立一个中间对象,来为某个对象的使用增加、屏蔽一些功能。
外观模式是屏蔽使用端和子系统间的业务逻辑关系,使他们解除耦合。更好地重用、和维护。
使用需求例子:
公司里只有一部打印机,大家都可以用、但是有一天你的老板说公司的打印机要求1、按优先级用。2、所有打印的材料都必须要备案(防止大家偷取公司的资料,事后可以找的到人)。
例1:过去实现代码
使用端:
static void Main(string[] args) { IUser user1 = new user1(); user1.Name = "张显红"; user1.Document = "通知,今天下午全部在会议室开会"; Printer print = new Printer(); print.Print(user1.Document); Console.Read(); ///代理就是AOP的编程,类似于中介。 ///代理和装饰模式的区别 }
打印机:
public class Printer { public Printer() { Console.WriteLine("打印机启动"); } public void Print(string content) { Console.WriteLine(content); } }
用户:
public abstract class IUser { public string Name { get; set; } public string Document { get; set; } }
public class user1 : IUser { }
例1中,我们没有对打印机进行权限管理。谁都可以打印,也没有记录别人打印过什么东西。打印机可以多次实例化,人多的时候造成竞争性关系,导致不能正常工作。
接下来我们根据需求进行改进:
使用端:
static void Main(string[] args) { IUser user1 = new user1(); user1.Name = "张显红"; user1.Document = "通知,今天下午全部在会议室开会"; IUser user2 = new User2(); user1.Name = "111"; user1.Document = "同学们,一起来公司应聘吧!"; Console.WriteLine("--------------------"); PrintProxy.printProxy.Print(user1); Console.WriteLine("--------------------"); PrintProxy.printProxy.Print(user2); Console.Read(); ///代理就是AOP的编程,类似于中介。 ///代理和装饰模式的区别 }
增加一个代理类:
public class PrintProxy { /// <summary> /// 实际例化打印机,让全局只允许同时有一个人在使用。 /// </summary> Printer printer = new Printer(); public readonly static PrintProxy printProxy = new PrintProxy(); Dictionary<string, string> PrintLog = new Dictionary<string, string>(); private PrintProxy(){} public void Print(IUser user) { if (!Check(user.Name)) { Console.WriteLine("没有打印权限"); return; } ///打印文件 printer.Print(user.Document); ///记录每次打印日志 PrintLog.Add(user.Name, user.Document); } private bool Check(string name) { return name == "111"; } }
结果图:
因为单例模式打印机只启动了一次(全局只允许同时只有一个人可以打印)
用户1和用户2都在打印,通过代理类,增加了相应的权限。用户2不能打印
同时将所有打印的文件记录到 PrintLog
完全解决了老板的需求。
是不是很酷
标签:
原文地址:http://www.cnblogs.com/lystory/p/5519481.html