设计模式—代理模式
前言
开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统代理不必要的复杂性,这时候可以在客户单和目标对象直接添加一层中间层,让代理对象代替目标对象,然后客户端只访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,即代理模式
代理模式介绍
代理的思路及原理:
通过增加代理来解耦a与c之间的调用,这样可以封装原理c调用a的一些细节,转换成c之间调用b中封装后的代理方法,等同于访问a.
电脑桌面的快捷方式就是一个代理对象,快捷方式使他所引用的程序的一个代理
1)实际例子
在现实生活中,如果有同事出国或者朋友出国的情况下,我们经常会拖这位朋友帮忙带一些电子产品或化妆品等东西,这个场景中,出国的朋友就是一个代理,他(她)是他(她)朋友的一个代理,由于他朋友不能去国外买东西,他却可以,所以朋友们都托他帮忙带一些东西的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 抽象主题角色 /// </summary> public abstract class Person { public abstract void BuyProduct(); } /// <summary> /// 真实主题角色 /// </summary> public class RealBuyPerson : Person { public override void BuyProduct() { Console.WriteLine("帮我买一个Iphone和一个苹果电脑"); } } /// <summary> /// 代理角色 /// </summary> public class Friend : Person { //引用真实主题实例 RealBuyPerson realSubject; public override void BuyProduct() { Console.WriteLine("通过代理类访问真实实体对象的方法"); if (realSubject == null) realSubject = new RealBuyPerson(); this.PreBuyProduct(); realSubject.BuyProduct(); this.PostBuyProduct(); } // 代理角色执行的一些操作 public void PreBuyProduct() { // 可能不知一个朋友叫这位朋友带东西,首先这位出国的朋友要对每一位朋友要带的东西列一个清单等 Console.WriteLine("我怕弄糊涂了,需要列一张清单,张三:要带相机,李四:要带Iphone..........."); } // 买完东西之后,代理角色需要针对每位朋友需要的对买来的东西进行分类 public void PostBuyProduct() { Console.WriteLine("终于买完了,现在要对东西分一下,相机是张三的;Iphone是李四的.........."); } } }
调用方式:
static void Main(string[] args) { //创建一个代理对象并发出请求 Person proxy = new Friend(); proxy.BuyProduct(); //使用webservice 调用 var a = new ServiceReference1.WebService1SoapClient().HelloWorld("my name dd"); Console.WriteLine(a); Console.Read(); }
2)代理模式介绍
抽象主题角色:声明了真实主题和代理主题的公共接口,这样在使用真实主题的任何地方都可以使用代理主题
代理主题角色:内部包含对真实主题的引用,从而可以操作真实主题对象,代理主题角色负重在需要的时候穿件真实主题对象,代理角色通常在将客户端调用传递到真实主题之前或之后,都要执行一些其他的操作,而不是单纯的将调用真实主题对象
真实主题角色:定义了代理角色所代表的真实对象
3)代理模式分析
一般代理类有什么要求呢?一般来说代理对象必须实现目标对象定义的一些接口,只有这样,客户端应用程序在使用的时候,通过接口调用来访
问目标对象的服务,否则就等于引入复杂度,反而没有解决问题。
使用代理的目的是控制客户端程序访问目标对象,因此代理必须知道目标对象的类型及目标对象在哪里,如何访问等都必须明确。
代理对象有的时候也可以是抽象类型,这样目标类型就可以是未确定的,我们可以通过创建型模式来动态的创建目标对象,当然前提是这些目标对象
是代理对象类型。
优点:代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度
在和客户端和目标对象直接起到中介作用,这样可以保护目标对象,代理对象可以在对目标对象发出请求之前或之后进行额外的操作例如权限验证等
缺点:由于中间添加了一个代理对象,所以会造成请求的速度变慢,另外实现代理模式也需要额外的工作,从而增加了系统的实现复杂性
5)代理模式和外观模式的区别
外观模式也是屏蔽复杂性的,单丝外观模式不会实现客户端调用的目标类型接口
一般客户端调用外观模式的方法都是直接调用
代理模式中对客户端目标对象类型抽象接口具体化了
外观模式是代理模式中一种特殊的子级模式(广泛的非约束的)