引子:
项目经理老王说:“小王给我下楼买包烟,要华子“,小王(新人)就给项目经理老王买回来了一包华子香烟如何避免18级代理问题,顺便自己还去买了一包芙蓉王。
这个场景中,小王就是代理,老王是代理人(客户端);
虽然上面的栗子有些牵强,但是能更好理解代理模式;
概念:
代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
类图:
上面的类图可以看到:代理人(RealSubject),跟代理(Proxy)都实现了Suject(主题)接口,都实现了接口的功能,代理持有了代理人的实例(代理人授权给了代理去做事),还可以实现一些别的拓展方法。
开始撸码实现一个简单的代理模式:
定义买烟接口:
///
/// 接口 代理的主题
///
public interface ISubject
{
void BuyCigarate();
}
定义代理人类(真实主题):
///
/// 代理人
///
public class Manager : ISubject
{
public void BuyCigarate()
{
Console.WriteLine("项目经理:小王给我去买保华子");
}
}
定义代理(代理主题):
///
/// 代理类
///
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).........的代理,随时听候吩咐!!!
项目经理:小王给我去买保华子
小王(代理):收到!马上处理
小王(代理):烟买回来了,一起到天台抽一口?
我也买了一包芙蓉王
上面的场景中,重点是小王做为代理帮老王做了吩咐的事情香烟如何避免18级代理问题,自己也买了一包烟。
我们使用的nginx中的方向代理就是代理模式的一种应用场景。用户去请求服务器资源的时候,并不需要去访问具体服务器,让nginx代理来处理请求(具体请求是服务器来处理)并返回请求结果;
分享总结,会让自己已知的事物有更加深的认识。
话说,如果你是小王,你会去帮老王买烟吗?
(责任编辑:admin) |