




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二零章代理模式二零.一模式簡(jiǎn)介二零.二虛擬代理二零.三遠(yuǎn)程代理二零.四計(jì)數(shù)代理二零.一模式簡(jiǎn)介+request()ISubject+request()RealSubject+preRequest+request()+postRequest()Proxy-realSubject:RealSubjectClient類圖:代理模式包含如下角色。?ISubject:抽象主題角色,是一個(gè)接口,該接口是對(duì)象與它地代理所用地接口。?RealSubject:真實(shí)主題角色,是實(shí)現(xiàn)抽象主題接口地類。?Proxy:代理角色,內(nèi)部含有對(duì)真實(shí)對(duì)象RealSubject地引用,從而可以操作真實(shí)對(duì)象,代理對(duì)象提供與真實(shí)對(duì)象相同地接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象。同時(shí),代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí),附加其它地操作,相當(dāng)于對(duì)真實(shí)對(duì)象行封裝。二零.二虛擬代理虛擬代理地關(guān)鍵思想是:如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大地對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小地對(duì)象來(lái)表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。當(dāng)用戶請(qǐng)求一個(gè)"大"對(duì)象時(shí),虛擬代理在該對(duì)象真正被創(chuàng)建出來(lái)之前扮演著替身地角色;當(dāng)該對(duì)象被創(chuàng)建出來(lái)之后,虛擬代理就將用戶地請(qǐng)求直接委托給該對(duì)象。例二零-一高校本科生科研信息查詢功能。序號(hào)字段名關(guān)鍵字說(shuō)明一account√帳號(hào)二Name
主持姓名三Project
項(xiàng)目名稱四Content
項(xiàng)目主要內(nèi)容五Plan
計(jì)劃安排表二零-一開放實(shí)驗(yàn)室數(shù)據(jù)庫(kù)表字段說(shuō)明圖二零-二初始界面示意圖圖二零-三鼠標(biāo)響應(yīng)界面示意圖(一)定義抽象主題接口IItempublicinterfaceIItem{ StringgetAccount(); voidsetAccount(Strings); StringgetName(); voidsetName(Strings); StringgetProject(); voidsetProject(Strings); StringgetContent(); StringgetPlan(); voiditemFill()throwsException;}(二)具體實(shí)現(xiàn)主題類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{//填充本項(xiàng)目content及plan字段 //第二級(jí)查詢SQL語(yǔ)句 StringstrSQL="selectcontent,planfromprojectwhereaccount='"+account+"'"; DbProcdbobj=newDbProc(); Connectionconn=dbobj.connect(); Statementstm=conn.createStatement(); ResultSetrst=stm.executeQuery(strSQL); rst.next(); content=rst.getString("content");//填充content字段內(nèi)容 plan=rst.getString("plan"); //填充plan字段 rst.close();stm.close();conn.close(); } }(三)代理主題類ProxyItempublicclassProxyItemimplementsIItem{ privateRealItemitem; booleanbFill;//標(biāo)識(shí)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; }}(四)代理項(xiàng)目集合類ManageItemspublicclassManageItems{ Vector<ProxyItem>v=newVector();//代理項(xiàng)目集合 publicvoidfirstSearch()throwsException{ StringstrSQL="selectaccount,name,projectfromproject";//第一級(jí)查詢SQL語(yǔ)句 DbProcdbobj=newDbProc(); Connectionconn=dbobj.connect(); Statementstm=conn.createStatement(); ResultSetrst=stm.executeQuery(strSQL); //獲得第一級(jí)查詢記錄集合 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(); //行第一級(jí)查詢
Stringtitle[]={"帳號(hào)","姓名","項(xiàng)目名稱"}; 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("項(xiàng)目主要內(nèi)容"); JLabellabel二=newJLabel("計(jì)劃安排"); 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){//行第二級(jí)查詢 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(); }}二零.三遠(yuǎn)程代理遠(yuǎn)程代理地意義是:為一個(gè)位于不同地地址空間地對(duì)象提供一個(gè)本地地代理對(duì)象,這個(gè)不同地地址空間可以是在同一臺(tái)主機(jī),也可是在另一臺(tái)主機(jī)。即:遠(yuǎn)程對(duì)象駐留于服務(wù)器上,客戶機(jī)請(qǐng)求調(diào)用遠(yuǎn)程對(duì)象調(diào)用相應(yīng)方法,執(zhí)行完畢后,結(jié)果由服務(wù)器返回給客戶端。申請(qǐng)執(zhí)行遠(yuǎn)程對(duì)象方法客戶端通信代理執(zhí)行遠(yuǎn)程對(duì)象方法服務(wù)器端通信代理網(wǎng)絡(luò)或USB等調(diào)用調(diào)用調(diào)返回用返回用圖二零-四遠(yuǎn)程代理基本框圖二零.三.一RMI通訊考慮一個(gè)簡(jiǎn)單地示例,客戶端輸入字符串?dāng)?shù)學(xué)表達(dá)式,僅含+,-運(yùn)算。服務(wù)器端計(jì)算該表達(dá)式值,從前向后依次運(yùn)行。一,創(chuàng)建服務(wù)器工程RmiServer,具體代碼如下所示。①定義抽象主題遠(yuǎn)程接口ICalcpublicinterfaceICalcextendsRemote{ floatcalc(Strings)throwsRemoteException;}②定義具體遠(yuǎn)程主題實(shí)現(xiàn)ServerCalcpublicclassServerCalcextendsUnicastRemoteObjectimplementsICalc{ publicServerCalc()throwsRemoteException{ super(); } publicfloatcalc(Strings)throwsRemoteException{ s+="+零"; floatresult=零; //最終結(jié)果變量 floatvalue=零; //拆分字符串對(duì)應(yīng)地浮點(diǎn)變量 charopcur='+'; //當(dāng)前操作符 charopnext; intstart=零; //字符串遍歷起始位置 if(s.charAt(零)=='-'){ //若是負(fù)數(shù)開始,則 opcur='-'; //修改當(dāng)前操作符 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));//按操作符拆分字符串對(duì)應(yīng)數(shù)值 switch(opcur){ case'+':result+=value;break; case'-':result-=value;break; } start=i+一;opcur=opnext; i=start; } } returnresult; }}③遠(yuǎn)程具體實(shí)現(xiàn)對(duì)象注冊(cè)類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通信需要行安全管理,防止任意用戶隨意行遠(yuǎn)程調(diào)用,基本方法是采用安全策略文件,它是一個(gè)文本文件,定義了遠(yuǎn)程訪問(wèn)地IP有關(guān)信息。本示例服務(wù)器端用到地安全策略文件server.policy描述如表二零-二所示。內(nèi)容說(shuō)明grant{ permissionjava..SocketPermission "localhost:一零九九","connect,accept,listen,resolve"; permissionjava..SocketPermission "二零零.四七.二二三.八:八零","connect,accept,listen,resolve";};
本機(jī)RMI應(yīng)用服務(wù)器允許本機(jī)一零九九端口訪問(wèn)。本機(jī)RMI應(yīng)用服務(wù)器允許指定IP端口訪問(wèn)。表二零-二服務(wù)器端安全策略文件server.policy④執(zhí)行服務(wù)器端注冊(cè)功能。為了方便,在d窗口下運(yùn)行。前提條件是path,classpath環(huán)境變量都已設(shè)置完畢。第一步,新開一個(gè)d窗口,運(yùn)行:startrmiregistry,則出現(xiàn)圖二零-五界面。圖二零-五RMI注冊(cè)服務(wù)器啟動(dòng)界面第二步,新開一個(gè)d窗口,輸入下述命令行(需要有安全策略文件選項(xiàng))命令行即可。java–Djava.sevurity.policy=server.policyRmiServer二,創(chuàng)建客戶端工程RmiClient,具體代碼如下所示。①定義抽象主題遠(yuǎn)程接口ICalcpublicinterfaceICalcextendsRemote{ floatcalc(Strings)throwsRemoteException;} 需要與服務(wù)器端定義地ICalc接口一致,特別注意包目錄需要完全相同。
②遠(yuǎn)程調(diào)用測(cè)試類publicclassRmiClient{ publicstaticvoidmain(String[]args){ if(System.getSecurityManager()==null) System.setSecurityManager(newRMISecurityManager()); try{ ICalcobj=(ICalc)Naming.lookup("rmi://localhost:一零九九/calc");//查詢遠(yuǎn)程對(duì)象 System.out.println(obj.calc("一+二+三")); //輸出遠(yuǎn)程對(duì)象結(jié)果 } catch(Exceptione){e.printStackTrace();} }}當(dāng)然RMI客戶端也采用安全策略文件,與表七-二內(nèi)容相仿,假設(shè)策略文件名為client.policy,則客戶端執(zhí)行命令行如下所示。 Java–Djava.security.policy=client.policyRmiClient二零.三.二RMI代理模擬一,創(chuàng)建服務(wù)器工程RmiServerSimu,具體代碼如下所示。①定義抽象主題遠(yuǎn)程接口ICalcpublicinterfaceICalc{ floatcalc(Strings)throwsException;}
②定義具體遠(yuǎn)程主題實(shí)現(xiàn)ServerCalcpublicclassServerCalcimplementsICalc{ publicfloatcalc(Strings)throwsException{ //代碼同七.三.一節(jié) } returnresult; }}③定義服務(wù)器端遠(yuǎn)程代理類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(); //讀取方法參數(shù) floatf=obj.calc(para); //計(jì)算出表達(dá)式值 out.writeObject(newFloat(f)); //返回給客戶端 out.flush(); } } } catch(Exceptione){e.printStackTrace();} }}④一個(gè)簡(jiǎn)單地測(cè)試類RmiServerSimupublicclassTest{ publicstaticvoidmain(String[]args){ ServerCalcobj=newServerCalc(); //定義具體實(shí)現(xiàn)類 ServerProxyspobj=newServerProxy(obj); //定義服務(wù)器遠(yuǎn)程代理類 spobj.start(); //啟動(dòng)線程 }}二,創(chuàng)建客戶端工程RmiClientSimu,具體代碼如下所示。①定義抽象主題遠(yuǎn)程接口ICalcpublicinterfaceICalc{ floatcalc(Strings)throwsException;}
②定義服務(wù)器端遠(yuǎn)程代理類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(); }}③一個(gè)簡(jiǎn)單地測(cè)試類RmiClientSimupublicclassClientTest{ publicstaticvoidmain(String[]args)throwsException{ ICalcobj=newClientProxy(); //客戶端代理對(duì)象初始化 floatvalue=obj.calc("二三+二+三"); //通過(guò)遠(yuǎn)程代理計(jì)算表達(dá)式地值 System.out.println("value="+value); }}二零.四計(jì)數(shù)代理當(dāng)客戶程序需要在調(diào)用服務(wù)提供者對(duì)象地方法之前或之后執(zhí)行日志或計(jì)數(shù)地額外功能時(shí),就可以使用計(jì)數(shù)代理模式。計(jì)數(shù)代理模式并不是把這些額外操作地代碼直接添加到源服務(wù),而是把它們封裝成一個(gè)單獨(dú)地對(duì)象,這即是計(jì)數(shù)代理??紤]這樣一個(gè)應(yīng)用,用計(jì)數(shù)代理統(tǒng)計(jì)圖書館每天借閱書籍地具體次數(shù)。具體代碼如下所示。一.定義書籍基本類BookclassBook{ privateStringNO; //書號(hào),假設(shè)僅有書號(hào),書名兩個(gè)屬 privateStringname; //書名 publicBook(StringNO,Stringname){ this.NO=NO; =name; } publicStringgetNO(){ returnNO; } publicvoidsetNO(StringnO){ NO=nO; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } }二.定義抽象主題接口IBorrowinterfaceIBorrow{ booleanborrow();//借閱過(guò)程}
三.定義借閱實(shí)現(xiàn)類BorrowclassBorrowimplementsIBorrow{ privateBookbook; publicvoidsetBook(Bookbook){ this.book=book; } publicBookgetBook(){ returnbook; } publicbooleanborrow(){ //保存信息到數(shù)據(jù)庫(kù)等功能,代碼略 returntrue; }}四.定義借閱代理類BorrowProxyclassBorrowProxyimplementsIBorrow{ privateBorrowobj; privateMap<String,Integer>map; publicBorrow
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度夫妻婚內(nèi)財(cái)產(chǎn)約定及家庭財(cái)務(wù)狀況監(jiān)測(cè)協(xié)議
- 2025年度白酒年份酒產(chǎn)區(qū)深度開發(fā)與合作合同
- 二零二五年度新能源企業(yè)代理招聘人才合同
- 二零二五年度獨(dú)立董事聘用合同(科技創(chuàng)新企業(yè))
- 二零二五年度全面數(shù)字化企業(yè)整體資產(chǎn)轉(zhuǎn)讓合同
- 二零二五年度解除勞動(dòng)合同關(guān)系及經(jīng)濟(jì)補(bǔ)償計(jì)算協(xié)議
- 2025年度道路養(yǎng)護(hù)勞務(wù)承包合同(智能化管理)
- 二零二五年度挖機(jī)運(yùn)輸與設(shè)備回收合同
- 浙江國(guó)企招聘2024中國(guó)郵政速遞物流股份有限公司舟山市普陀區(qū)分公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025陜西煤業(yè)新型能源科技股份有限公司招聘(31人)筆試參考題庫(kù)附帶答案詳解
- 全國(guó)大學(xué)生英語(yǔ)競(jìng)賽輔導(dǎo)課件教學(xué)培訓(xùn)課件
- 2024年四川省成都市青羊區(qū)中考數(shù)學(xué)二診試卷(含答案)
- 2024年保安員考試題庫(kù)【典型題】
- Unit 2 Lets celebrate Developing ideas-Writing a letter to express 課件【知識(shí)精講+拓展訓(xùn)練】高中英語(yǔ)外研版(2019)必修第二冊(cè)
- 2024年湖南有色金屬職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)完美版含答案解析
- 2024年江蘇衛(wèi)生健康職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案解析0
- 《中國(guó)陶瓷史》課件-3-陶與瓷
- 數(shù)學(xué)教育的國(guó)際比較與交流
- 2023年4月自考00160審計(jì)學(xué)試題及答案含解析
- 案卷評(píng)查培訓(xùn)課件模板
- 醫(yī)院死亡證明培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論