代理模式(Proxy),为其余对象提供一种代理以控制对这个对象的访问。javascript
在某些状况下,一个对象不适合或者不能直接引用另外一个对象,而代理对象能够在客户端和目标对象之间起到中介的做用。html
代理模式的优势:java
(1)、职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其余非本职责的事务,经过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2)、代理对象能够在客户端和目标对象之间起到中介的做用,这样起到了的做用和保护了目标对象的做用。
(3)、高扩展性git
代理模式的UML图:编程
代码示例:设计模式
namespace ConsoleApplication1 { abstract class Subject { public abstract void Request(); } class RealSubject : Subject { public override void Request() { Console.WriteLine("真实的请求!"); } } //代理类 class Proxy : Subject { RealSubject realSubject; //用于装载真实对象 public override void Request() { if (realSubject == null) { realSubject = new RealSubject(); //得到真实对象 } realSubject.Request(); //调用真实对象的请求方法 } } class Program { static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); //输出真实的请求 Console.ReadKey(); } } }
从代码来看,代理模式的思想是很简单的,难度应该在怎么灵活应用上。安全
namespace 代理模式 { class Program { static void Main(string[] args) { 小夫 proxy = new 小夫(); proxy.Hit(); //输出真实的请求 Console.ReadKey(); } } abstract class Subject { public abstract void Hit(); } class 胖虎 : Subject { public override void Hit() { Console.WriteLine("揍大雄!"); //Type t = this.GetType(); //Console.WriteLine("揍大雄的人是:" + t.Name); } } //代理类 class 小夫 : Subject { 胖虎 realSubject; //把胖虎放到小夫家 public override void Hit() { if (realSubject == null) { realSubject = new 胖虎(); //胖虎来了 } realSubject.Hit(); //让胖虎揍大雄 } } }
典型的应用场景是,当真正的处理类不方便使用时,就能够使用代理模式。ide