代理模式
代理模式是一种非常重要的设计模式,在面向对象程序编程有着广泛的应用,包括AOP组件的核心设计思想,都和代理模式有密切关系。
代理模式主要分两种:一种是静态代理,一种是动态代理。两种代理方式的实现有着本质的差异。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端
和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:
声明真实对象和代理对象的共同接口。
代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同
时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。
下面重点说下静态代理:
静态代理代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类。
示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Proxy { /// <summary> /// 抽象角色 /// </summary> public abstract class Subject { public abstract void Requst(); } /// <summary> /// 真实角色 /// </summary> public class RealSubject : Subject { public override void Requst() { Console.WriteLine("真实的角色调用"); } } /// <summary> /// 代理角色 /// </summary> public class ProxySubject : Subject { private RealSubject _realSubject; public override void Requst() { PreRequest(); if (_realSubject == null) _realSubject = new RealSubject(); _realSubject.Requst(); PostRequest(); } private void PreRequest() { Console.WriteLine("代理前执行的操作ProxySubject.PreRequest()"); } private void PostRequest() { Console.WriteLine("代理后执行的操作ProxySubject.PostRequest()"); } } }
客户端调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Proxy { class Program { static void Main(string[] args) { Subject subject=new ProxySubject(); subject.Requst(); Console.ReadLine(); } } }
实际案例
比如我们在做开发中项目中引用WCF 、WebService,VS会自动为我们生成本地代理类,这就让客户端通过代理解决了远程对象访问的问题。