代理模式
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
首先从表面上看,最容易理解的就是代理为别人完成某件事(为他人做嫁衣)
场景:
某某A要追求某某C,这个时候某某A要求某某B代理自己去追求C
图片:
根据图片就知道代理跟真实的行为是一样的,不过时提供了一种访问的间接性
//被最求者
class person { private string name; public string Name { get { return name; } set { name = value; } } }
//共同需要的接口 interface GiveGift { void SongHua(); void SongWaWa(); void SongQiaoKeLi(); } /// <summary> ///追求者A /// </summary> class A : GiveGift { person p; public A(person person) { this.p = person; } /// <summary> /// 具体方法的实现/实际的行为 /// </summary> public void SongHua() { Console.WriteLine(p.Name+="送你鲜花"); } public void SongQiaoKeLi() { Console.WriteLine(p.Name+="送你巧克力"); } public void SongWaWa() { Console.WriteLine(p.Name+="送你洋娃娃"); } } /// <summary> /// 代理 /// </summary> class B : GiveGift { A a; public B(person person) { this.a = new A(person); } public void SongHua() { //在实现方法中调用追求者类的相关代码 a.SongHua(); } public void SongQiaoKeLi() { a.SongQiaoKeLi(); } public void SongWaWa() { a.SongWaWa(); } }
客户端调用:调用代理就好
static void Main(string[] args) { person p = new person(){Name="saili" }; B b = new B(p); b.SongHua(); b.SongQiaoKeLi(); b.SongWaWa(); Console.ReadKey(); }
说白了,代理就是真实对象的代表。
代理模式的其他应用
一:远程代理,也就是为一个对象在不同的地址空间提供局部代码,这样可以隐藏一个对象存在于不同地址空间的事实。
例如LwebService WCF引用webservice此时会在项目中生成一些的文件夹和文件,其实就是代理,可以使得客户端程序调用代理解决远程访问的问题
二:虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长的时间的真实对象,这样可以达到性能的最优化
例如:你打开一个很大的HTML的页面,里面可能有很多的文字和图片,但是你可以很快的打开他,此时你看到的是所有的文字,但图片却是一张一张的下载下来才能看,那些未打算开的图片,就是通过虚拟的代理来替代了真实的图片,此时代理存放真正的图片路径和尺寸。
三:安全代理:用来控制真实对象访问时的权限,一般用于对象有不同的权限的时候
四:智能指引,是指调用真实的对象时,代理处理另外一些事情
例如:计算真实对象的引用次数,这样当该对象没有引用的时候,可以自动释放它,或者第一次引用一个持久对象将它装入内存,或者在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。
才开始用的时候很像委托,特意上网查了一下
代理(Proxy)其实是一种设计模式,例如:某个不想被外界访问或者禁止直接被外界的对象,此时需要有一个中介使其能够与外界进行通讯,而种中介就称做代理。而C#中的委托(Delegate)有些不同,其本质是一种函数指针,其只是把对象委托给它的方法原封不动地提供给其他对象调用,并不能做任何的修饰。而代理并不是按照原接口提供出去,其做法是自身定义一个与被代理对象相同或者相似的接口提供给外界调用,因为提供的方法完全由代理本身的性质决定