引子:
项目经理老王说:“小王给我下楼买包烟,要华子“,小王(新人)就给项目经理老王买回来了一包华子,顺便自己还去买了一包芙蓉王。
这个场景中,小王就是代理,老王是代理人(客户端);
概念:
代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
类图:
上面的类图可以看到:代理人(RealSubject),跟代理(Proxy)都实现了Suject(主题)接口,都实现了接口的功能,代理持有了代理人的实例(代理人授权给了代理去做事),还可以实现一些别的拓展方法。
开始撸码实现一个简单的代理模式:
定义买烟接口:
/// <summary>/// 接口 代理的主题/// </summary>public interface ISubject{ void BuyCigarate();}
定义代理人类:
/// <summary>/// 代理人/// </summary>public class Manager : ISubject{ public void BuyCigarate() { Console.WriteLine("项目经理:小王给我去买保华子"); }}
定义代理:
/// <summary>/// 代理类/// </summary>public class DeveloperProxy : ISubject{ private Manager _manager; public DeveloperProxy( Manager manager) { Console.WriteLine("我是项目经理(月薪7W).........的代理,随时听候吩咐!!!"); _manager = manager; } public void BuyCigarate() { _manager.BuyCigarate(); //实现的也是代理人的方法 Console.WriteLine("小王(代理):收到!马上处理"); Console.WriteLine("小王(代理):烟买回来了,一起到天台抽一口?"); BuyFrw(); } public void BuyFrw() { Console.WriteLine("我也买了一包芙蓉王"); }}
测试:
static void Main(string[] args){ //定义代理人 Manager manager = new Manager(); //定义代理 DeveloperProxy proxy = new DeveloperProxy(manager); //执行代理的动作 proxy.BuyCigarate(); Console.Read();}
测试结果:
我是项目经理(月薪7W).........的代理,随时听候吩咐!!!项目经理:小王给我去买保华子小王(代理):收到!马上处理小王(代理):烟买回来了,一起到天台抽一口?我也买了一包芙蓉王
上面的场景中,重点是小王做为代理帮老王做了吩咐的事情,自己也买了一包烟。
我们使用的nginx中的方向代理就是代理模式的一种应用场景。用户去请求服务器资源的时候,并不需要去访问具体服务器,让nginx代理来处理请求(具体请求是服务器来处理)并返回请求结果;
分享总结,会让自己已知的事物有更加深的认识。
话说,如果你是小王,你会去帮老王买烟吗?
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除