版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二零章代理模式二零.一模式简介二零.二虚拟代理二零.三远程代理二零.四计数代理二零.一模式简介+request()ISubject+request()RealSubject+preRequest+request()+postRequest()Proxy-realSubject:RealSubjectClient类图:代理模式包含如下角色。•ISubject:抽象主题角色,是一个接口,该接口是对象与它地代理所用地接口。•RealSubject:真实主题角色,是实现抽象主题接口地类。•Proxy:代理角色,内部含有对真实对象RealSubject地引用,从而可以操作真实对象,代理对象提供与真实对象相同地接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其它地操作,相当于对真实对象行封装。二零.二虚拟代理虚拟代理地关键思想是:如果需要创建一个资源消耗较大地对象,先创建一个消耗相对较小地对象来表示,真实对象只在需要时才会被真正创建。当用户请求一个"大"对象时,虚拟代理在该对象真正被创建出来之前扮演着替身地角色;当该对象被创建出来之后,虚拟代理就将用户地请求直接委托给该对象。例二零-一高校本科生科研信息查询功能。序号字段名关键字说明一account√帐号二Name
主持姓名三Project
项目名称四Content
项目主要内容五Plan
计划安排表二零-一开放实验室数据库表字段说明图二零-二初始界面示意图图二零-三鼠标响应界面示意图(一)定义抽象主题接口IItempublicinterfaceIItem{ StringgetAccount(); voidsetAccount(Strings); StringgetName(); voidsetName(Strings); StringgetProject(); voidsetProject(Strings); StringgetContent(); StringgetPlan(); voiditemFill()throwsException;}(二)具体实现主题类RealItempublicclassRealItemimplementsIItem{ privateStringaccount; privateStringname; privateStringproject; privateStringcontent; privateStringplan;
publicStringgetAccount(){returnaccount;} publicvoidsetAccount(Stringaccount){this.account=account;} publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;} publicStringgetProject(){returnproject;} publicvoidsetProject(Stringproject){ject=project;} publicStringgetContent(){returncontent;} publicStringgetPlan(){returnplan;} publicvoiditemFill()throwsException{//填充本项目content及plan字段 //第二级查询SQL语句 StringstrSQL="selectcontent,planfromprojectwhereaccount='"+account+"'"; DbProcdbobj=newDbProc(); Connectionconn=dbobj.connect(); Statementstm=conn.createStatement(); ResultSetrst=stm.executeQuery(strSQL); rst.next(); content=rst.getString("content");//填充content字段内容 plan=rst.getString("plan"); //填充plan字段 rst.close();stm.close();conn.close(); } }(三)代理主题类ProxyItempublicclassProxyItemimplementsIItem{ privateRealItemitem; booleanbFill;//标识content,plan字段是否填充 publicProxyItem(RealItemitem){ this.item=item; } publicStringgetAccount(){ returnitem.getAccount(); } publicvoidsetAccount(Strings){ item.setAccount(s); } publicStringgetName(){ returnitem.getName(); } publicvoidsetName(Strings){ item.setName(s); } publicStringgetProject(){ returnitem.getProject(); } publicvoidsetProject(Strings){ item.setProject(s); } publicStringgetContent(){ returnitem.getContent(); } publicStringgetPlan(){ returnitem.getPlan(); } publicvoiditemFill()throwsException{ if(!bFill) item.itemFill(); bFill=true; }}(四)代理项目集合类ManageItemspublicclassManageItems{ Vector<ProxyItem>v=newVector();//代理项目集合 publicvoidfirstSearch()throwsException{ StringstrSQL="selectaccount,name,projectfromproject";//第一级查询SQL语句 DbProcdbobj=newDbProc(); Connectionconn=dbobj.connect(); Statementstm=conn.createStatement(); ResultSetrst=stm.executeQuery(strSQL); //获得第一级查询记录集合 while(rst.next()){ ProxyItemobj=newProxyItem(newRealItem()); obj.setAccount(rst.getString("account")); obj.setName(rst.getString("name")); obj.setProject(rst.getString("project")); v.add(obj); } rst.close();stm.close();conn.close(); } }(五)界面显示及消息映射类UFramepublicclassUFrameextendsJFrameimplementsMouseListener{ ManageItemsmanage=newManageItems(); JTabletable; JTextAreat=newJTextArea(); JTextAreat二=newJTextArea(); publicvoidinit()throwsException{ setLayout(null); manage.firstSearch(); //行第一级查询
Stringtitle[]={"帐号","姓名","项目名称"}; Stringdata[][]=null; Vector<ProxyItem>v=manage.v; data=newString[v.size()][title.length]; for(inti=零;i<v.size();i++){ ProxyItemproxy=v.get(i); data[i][零]=proxy.getAccount(); data[i][一]=proxy.getName(); data[i][二]=proxy.getProject(); }
table=newJTable(data,title); JScrollPanepane=newJScrollPane(table); pane.setBounds(一零,一零,二零零,三四零);
JLabellabel=newJLabel("项目主要内容"); JLabellabel二=newJLabel("计划安排"); label.setBounds(二三零,五,一零零,二零);t.setBounds(二三零,四零,二零零,一零零); label二.setBounds(二三零,一六零,一零零,二零);t二.setBounds(二三零,一九五,二零零,一零零);
add(pane); add(label);add(t); add(label二);add(t二);
table.addMouseListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(五零零,三五零); setVisible(true); } publicvoidmouseClicked(MouseEventevent){//行第二级查询 try{ intn=table.getSelectedRow(); if(n>=零){ ProxyItemitem=manage.v.get(n); item.itemFill(); t.setText(item.getContent()); t二.setText(item.getPlan()); } } catch(Exceptione){} } publicstaticvoidmain(String[]args)throwsException{ newUFrame().init(); }}二零.三远程代理远程代理地意义是:为一个位于不同地地址空间地对象提供一个本地地代理对象,这个不同地地址空间可以是在同一台主机,也可是在另一台主机。即:远程对象驻留于服务器上,客户机请求调用远程对象调用相应方法,执行完毕后,结果由服务器返回给客户端。申请执行远程对象方法客户端通信代理执行远程对象方法服务器端通信代理网络或USB等调用调用调返回用返回用图二零-四远程代理基本框图二零.三.一RMI通讯考虑一个简单地示例,客户端输入字符串数学表达式,仅含+,-运算。服务器端计算该表达式值,从前向后依次运行。一,创建服务器工程RmiServer,具体代码如下所示。①定义抽象主题远程接口ICalcpublicinterfaceICalcextendsRemote{ floatcalc(Strings)throwsRemoteException;}②定义具体远程主题实现ServerCalcpublicclassServerCalcextendsUnicastRemoteObjectimplementsICalc{ publicServerCalc()throwsRemoteException{ super(); } publicfloatcalc(Strings)throwsRemoteException{ s+="+零"; floatresult=零; //最终结果变量 floatvalue=零; //拆分字符串对应地浮点变量 charopcur='+'; //当前操作符 charopnext; intstart=零; //字符串遍历起始位置 if(s.charAt(零)=='-'){ //若是负数开始,则 opcur='-'; //修改当前操作符 start=一; //修改字符串遍历起始位置 } //遍历字符串 for(inti=start;i<s.length();i++){ if(s.charAt(i)=='+'||s.charAt(i)=='-'){ opnext=s.charAt(i); value=Float.parseFloat(s.substring(start,i));//按操作符拆分字符串对应数值 switch(opcur){ case'+':result+=value;break; case'-':result-=value;break; } start=i+一;opcur=opnext; i=start; } } returnresult; }}③远程具体实现对象注册类RmiServerpublicclassRmiServer{ publicstaticvoidmain(String[]args){ if(System.getSecurityManager()==null) System.setSecurityManager(newRMISecurityManager()); try{ ServerCalcobj=newServerCalc(); Naming.rebind("calc",obj); System.out.println("serverbindsuccess!!!!!"); } catch(Exceptione){e.printStackTrace();} }}另外,RMI通信需要行安全管理,防止任意用户随意行远程调用,基本方法是采用安全策略文件,它是一个文本文件,定义了远程访问地IP有关信息。本示例服务器端用到地安全策略文件server.policy描述如表二零-二所示。内容说明grant{ permissionjava..SocketPermission "localhost:一零九九","connect,accept,listen,resolve"; permissionjava..SocketPermission "二零零.四七.二二三.八:八零","connect,accept,listen,resolve";};
本机RMI应用服务器允许本机一零九九端口访问。本机RMI应用服务器允许指定IP端口访问。表二零-二服务器端安全策略文件server.policy④执行服务器端注册功能。为了方便,在d窗口下运行。前提条件是path,classpath环境变量都已设置完毕。第一步,新开一个d窗口,运行:startrmiregistry,则出现图二零-五界面。图二零-五RMI注册服务器启动界面第二步,新开一个d窗口,输入下述命令行(需要有安全策略文件选项)命令行即可。java–Djava.sevurity.policy=server.policyRmiServer二,创建客户端工程RmiClient,具体代码如下所示。①定义抽象主题远程接口ICalcpublicinterfaceICalcextendsRemote{ floatcalc(Strings)throwsRemoteException;} 需要与服务器端定义地ICalc接口一致,特别注意包目录需要完全相同。
②远程调用测试类publicclassRmiClient{ publicstaticvoidmain(String[]args){ if(System.getSecurityManager()==null) System.setSecurityManager(newRMISecurityManager()); try{ ICalcobj=(ICalc)Naming.lookup("rmi://localhost:一零九九/calc");//查询远程对象 System.out.println(obj.calc("一+二+三")); //输出远程对象结果 } catch(Exceptione){e.printStackTrace();} }}当然RMI客户端也采用安全策略文件,与表七-二内容相仿,假设策略文件名为client.policy,则客户端执行命令行如下所示。 Java–Djava.security.policy=client.policyRmiClient二零.三.二RMI代理模拟一,创建服务器工程RmiServerSimu,具体代码如下所示。①定义抽象主题远程接口ICalcpublicinterfaceICalc{ floatcalc(Strings)throwsException;}
②定义具体远程主题实现ServerCalcpublicclassServerCalcimplementsICalc{ publicfloatcalc(Strings)throwsException{ //代码同七.三.一节 } returnresult; }}③定义服务器端远程代理类ServerProxypublicclassServerProxyextendsThread{ ServerCalcobj; publicServerProxy(ServerCalcobj){ this.obj=obj; } publicvoidrun(){ try{ ServerSockets=newServerSocket(四零零零); Socketsocket=s.accept(); while(socket!=null){ ObjectInputStreamin=newObjectInputStream(socket.getInputStream()); ObjectOutputStreamout=newObjectOutputStream(socket.getOutputStream()); Stringmethod=(String)in.readObject(); //读取方法字符串 if(method.equals("calc")){ Stringpara=(String)in.readObject(); //读取方法参数 floatf=obj.calc(para); //计算出表达式值 out.writeObject(newFloat(f)); //返回给客户端 out.flush(); } } } catch(Exceptione){e.printStackTrace();} }}④一个简单地测试类RmiServerSimupublicclassTest{ publicstaticvoidmain(String[]args){ ServerCalcobj=newServerCalc(); //定义具体实现类 ServerProxyspobj=newServerProxy(obj); //定义服务器远程代理类 spobj.start(); //启动线程 }}二,创建客户端工程RmiClientSimu,具体代码如下所示。①定义抽象主题远程接口ICalcpublicinterfaceICalc{ floatcalc(Strings)throwsException;}
②定义服务器端远程代理类ClientProxypublicclassClientProxyimplementsICalc{ Socketsocket; publicClientProxy()throwsException{ socket=newSocket("localhost",四零零零); } publicfloatcalc(Stringexpression)throwsException{ ObjectOutputStreamout=newObjectOutputStream(socket.getOutputStream()); ObjectInputStreamin=newObjectInputStream(socket.getInputStream()); out.writeObject("calc"); out.writeObject(expression); Floatvalue=(Float)in.readObject(); returnvalue.floatValue(); }}③一个简单地测试类RmiClientSimupublicclassClientTest{ publicstaticvoidmain(String[]args)throwsException{ ICalcobj=newClientProxy(); //客户端代理对象初始化 floatvalue=obj.calc("二三+二+三"); //通过远程代理计算表达式地值 System.out.println("value="+value); }}二零.四计数代理当客户程序需要在调用服务提供者对象地方法之前或之后执行日志或计数地额外功能时,就可以使用计数代理模式。计数代理模式并不是把这些额外操作地代码直接添加到源服务,而是把它们封装成一个单独地对象,这即是计数代理。考虑这样一个应用,用计数代理统计图书馆每天借阅书籍地具体次数。具体代码如下所示。一.定义书籍基本类BookclassBook{ privateStringNO; //书号,假设仅有书号,书名两个属 privateStringname; //书名 publicBook(StringNO,Stringname){ this.NO=NO; =name; } publicStringgetNO(){ returnNO; } publicvoidsetNO(StringnO){ NO=nO; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } }二.定义抽象主题接口IBorrowinterfaceIBorrow{ booleanborrow();//借阅过程}
三.定义借阅实现类BorrowclassBorrowimplementsIBorrow{ privateBookbook; publicvoidsetBook(Bookbook){ this.book=book; } publicBookgetBook(){ returnbook; } publicbooleanborrow(){ //保存信息到数据库等功能,代码略 returntrue; }}四.定义借阅代理类BorrowProxyclassBorrowProxyimplementsIBorrow{ privateBorrowobj; privateMap<String,Integer>map; publicBorrow
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年德国智商协会测试题及答案
- 2026年前程无忧能力测试题及答案
- 2026年透视经济现象测试题及答案
- 2026年写作性格测试题及答案
- 2026年理财软件的测试题及答案
- 初中合作手工“展巧手”主题班会说课稿2025
- 2026年档案归档测试题及答案
- 2026年小米汽车机电工程师秋招笔试题及答案
- 初中环保探究2025年实践活动说课稿
- 高中情绪表达策略2025说课稿
- 课件:CRTSⅢ型板式无砟轨道讲解
- 825合金20钢双金属复合管焊接工艺
- (正式版)JBT 106-2024 阀门的标志和涂装
- 钢结构焊接技术的基础知识
- 超声消融术在肿瘤治疗中的应用
- 2023年各省高中数学竞赛预赛试题汇编
- 第一二章 野生植物资源开发(总论)
- 2016SSZN-MJG 装配式建筑系列标准应用实施指南(木结构建筑)
- 《2和5的倍数的特征》课件(省一等奖)
- 马鞍山三基轻合金成型科技有限公司年产30000吨轻量化高性能铝合金零部件项目环境影响报告表
- 购物广场夏季空调开关管理规定
评论
0/150
提交评论