代理模式
“代理”两字经常听到,在公司里有代理服务器,在我的理解里代理就是个中转站,但是在用户的体验里跟不用代理是一样的。代理模式是为一个对象提供代理对象,代理对象封装了被代理对象的引用。
模式设计的角色:
抽象主题:代理对象和被代理对象公共的接口。
具体主题:被代理对象。
代理对象:模式的核心对象,包含了被代理对象的引用,实施对被代理对象的控制。
结构示意图:
/// <summary> /// 抽象主题角色 /// </summary> public abstract class Subject { /// <summary> /// 模仿登录 /// </summary> abstract public void Login(); } /// <summary> /// 具体主题角色 /// </summary> public class ConcreteSubject : Subject { public override void Login() { throw new NotImplementedException(); } } /// <summary> /// 主题代理角色 /// </summary> public class Proxy : Subject { private ConcreteSubject concreteSubject; /// <summary> /// 验证 /// </summary> private void Volidate() { } public override void Login() { Volidate(); if (concreteSubject == null) { concreteSubject = new ConcreteSubject(); } concreteSubject.Login(); Log(); } /// <summary> /// 写日志 /// </summary> private void Log() { } }
上面简单的用代码实现了代理模式,被代理对象和代理对象都要从公共的抽象类继承,代理对象并不是要改变被代理对象的接口,否则就跟适配器模式混为一谈了,而是加强。在客户端看来,两者在使用起来并没什么区别。
符合的设计原则:开闭原则、接口单一原则。当要加强一个类的作用时,并不是不加限制的去增加方法,这样显得很冗余,也不符合面向对象设计方法。而是要责任分开,使用代理对象去实现,这样可以不用去修改原来的类而达到目的。