《16.设计模式.代理模式(Proxy)》由会员分享,可在线阅读,更多相关《16.设计模式.代理模式(Proxy)(45页珍藏版)》请在金锄头文库上搜索。
1、LOGO设计模式(Design Pattern)张凯 副教授 计算机学院 软件工程系武汉科技大学 问题(Problem)v我们毕业啦!托运了轻装启程!武汉科技大学 问题(Problem)v我们毕业啦!托运了轻装启程!武汉科技大学 问题(Problem)/快递工作人员class ExpressPersonprivate string name;public string Nameget return name; set name = value; 武汉科技大学 问题(Problem)/毕业 生class GraduateExpressPerson YDY;public Graduate(
2、ExpressPerson YDY)this.YDY = YDY;public void GiveComputer()Console.WriteLine(YDY.Name + “ 请你托运计算机“);public void GiveBaggage()Console.WriteLine(YDY.Name + “ 请你托运行李“);武汉科技大学 问题(Problem)static void Main(string args)ExpressPerson YDY = new ExpressPerson();YDY.Name = “宅急送“;Graduate zhangsan = new Gradua
3、te(YDY);zhangsan.GiveComputer();zhangsan.GiveBaggage();Console.Read();武汉科技大学 问题(Problem)/女同学class ClassmateExpressPerson YDY;public Classmate(ExpressPerson YDY)this.YDY = YDY;public void GiveComputer()Console.WriteLine(YDY.Name + “ 请你托运计算机“);public void GiveBaggage()Console.WriteLine(YDY.Name + “ 请
4、你托运行李“);武汉科技大学 问题(Problem)static void Main(string args)ExpressPerson YDY = new ExpressPerson();YDY.Name = “宅急送“;Classmate Girl = new Classmate(YDY);Girl.GiveComputer();Girl.GiveBaggage();Console.Read();武汉科技大学 问题(Problem)/快递工作人员class ExpressPersonprivate string name;public string Nameget return nam
5、e; set name = value; 武汉科技大学 问题(Problem)/寄东西interface GiveObjectvoid GiveComputer();void GiveBaggage();武汉科技大学 问题(Problem)/毕业 生class Graduate : GiveObjectExpressPerson YDY;public Graduate(ExpressPerson YDY)this.YDY = YDY;public void GiveComputer()Console.WriteLine(YDY.Name + “ 请你托运计算机“);public void
6、GiveBaggage()Console.WriteLine(YDY.Name + “ 请你托运行李“);武汉科技大学 问题(Problem)/女同学 : GiveGiftclass Classmate : GiveObjectGraduate zhangsan;public Classmate(ExpressPerson YDY)zhangsan = new Graduate(YDY);public void GiveComputer()zhangsan.GiveComputer();public void GiveBaggage()zhangsan.GiveBaggage();武汉科技大
7、学 问题(Problem)static void Main(string args)ExpressPerson YDY = new ExpressPerson();YDY.Name = “宅急送“;Classmate Girl = new Classmate(YDY);Girl.GiveComputer();Girl.GiveBaggage();Console.Read();武汉科技大学 主要内容模式动机与定义1模式结构与分析2模式实例与解析3模式效果与应用4武汉科技大学 代理模式(Proxy)v模式动机 模式名称:代理模式(Proxy) 一个客户不想或者不能够直接引用一个对象,而代理对
8、象可以在客户端和目标对象之间起到中介的作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。如在网页上查看一张图片,由于网速等原因图片不能立即显示,我们可以在图片传输过程中先把一些简单的用于描述图片的文字传输到客户端,此时这些文字就成为了图片的代理。武汉科技大学 代理模式(Proxy)v模式定义 代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate。代理模式是一种对象结构型模式。武汉科技大学 代理模式(Proxy)v模式结构 武汉科技大学 代理模式(Proxy)v参与者 Subject:
9、抽象主题角色 Proxy:代理主题角色 RealSubject:真实主题角色 武汉科技大学 代理模式(Proxy)v参与者 抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题 真实主题(RealSubject)角色:定义了代理角色所代表的真实对象武汉科技大学 代理模式(Proxy)v参与者 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题;控制真实主题的应用,负责在需要的时候创建真实主题对
10、象(和删除真实主题对象)武汉科技大学 代理模式(Proxy)v在软件系统中,我们无时不在跨越障碍,当我们访问网络上一台计算机的资源时,我们正在跨越网络障碍,当我们去访问服务器上数据库时,我们又在跨越数据库访问障碍,同时还有网络障碍。跨越这些障碍有时候是非常复杂的,如果我们更多的去关注处理这些障碍问题,可能就会忽视了本来应该关注的业务逻辑问题,Proxy模式有助于我们去解决这些问题。武汉科技大学 代理模式(Proxy)v我们以一个简单的数学计算程序为例,这个程序只负责进行简单的加减乘除运算:public class Mathpublic double Add(double x,double
11、y)return x + y;public double Sub(double x,double y)return x - y;public double Mul(double x,double y)return x * y;public double Dev(double x,double y)return x / y; 武汉科技大学 代理模式(Proxy)v如果说这个计算程序部署在我们本地计算机上,使用就非常之简单了,我们也就不用去考虑Proxy模式了。但现在问题是这个Math类并没有部署在我们本地,而是部署在一台服务器上,也就是说Math类根本和我们的客户程序不在同一个地址空间之内,我
12、们现在要面对的是跨越Internet这样一个网络障碍:武汉科技大学 代理模式(Proxy)v这时候调用Math类的方法就没有那么简单了,因为我们更多的还要去考虑网络的问题,对接收到的结果解包等一系列操作 武汉科技大学 代理模式(Proxy)v为了解决由于网络等障碍引起的复杂性,就引出了Proxy模式,我们使用一个本地的代理来替Math类打点一切,即为我们的系统引入了一层间接层 武汉科技大学 代理模式(Proxy)v我们在MathProxy中实现对Math数据类的访问,让MathProxy来代替网络上的Math类,这样我们看到MathProxy就好像是本地Math类,它与客户程序处在了同一
13、地址空间内: 武汉科技大学 代理模式(Proxy)public class MathProxyprivate Math math ;public MathProxy() math=new Math(); / 以下的方法中,可能不仅仅 是简单 的调用Math类的方法 public double Add(double x,double y)return math.Add(x,y);public double Sub(double x,double y)return math.Sub(x,y); public double Mul(double x,double y)return math.Mul
14、(x,y); public double Dev(double x,double y)return math.Dev(x,y); 武汉科技大学 代理模式(Proxy)v 现在可以说我们已经实现了对Math类的代理,存在的一个问题是我们在MathProxy类中调用了原实现类Math的方法,但是Math并不一定实现了所有的方法,为了强迫Math类实现所有的方法,另一方面,为了我们更加透明的去操作对象,我们在Math类和MathProxy类的基础上加上一层抽象,即它们都实现与IMath接口武汉科技大学 代理模式(Proxy)public interface IMathdouble Add(double x,double y);double Sub(double x,double y);double Mul(double x,double y);double Dev(double x,double y);/Math类和MathProxy类分别实现 IMath接口:public class MathProxy : IMath。public class Math : IMath。 武汉科技大学 代理模式(Proxy)v此时我们在客户程序中就可