設(shè)計(jì)模式適配器模式_第1頁
設(shè)計(jì)模式適配器模式_第2頁
設(shè)計(jì)模式適配器模式_第3頁
設(shè)計(jì)模式適配器模式_第4頁
設(shè)計(jì)模式適配器模式_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一八章適配器模式一八.一問題地提出一八.二適配器模式一八.三默認(rèn)適配器一八.四應(yīng)用示例一八.一問題地提出也就是說:當(dāng)我們開發(fā)新系統(tǒng)時(shí),生活采用已有子組件基礎(chǔ)上地再開發(fā)。在計(jì)算機(jī)程序設(shè)計(jì)也應(yīng)該考慮這種"子組件",也即是第三方已開發(fā)地軟件,那么如何更好地應(yīng)用第三方軟件呢?適配器模式是一個(gè)較好地開發(fā)思路。一八.二適配器模式抽象來說:將一個(gè)類地接口轉(zhuǎn)換成客戶希望地另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作地那些類可以一起工作。適配器模式地宗旨就是,基于現(xiàn)有類所提供地服務(wù),向客戶端提供接口,以滿足客戶地期望。主要分為兩類:對象適配器,類適配器。一八.二.一對象適配器<<interface>>IHopeInterface

+request():voidThirdpany

+thirdRequest():voidAdapter-third:Thirdpany+Adapter(third:Thirdpany)+request():voidclient圖一八-一對象適配器抽象類圖各個(gè)角色描述如下所示?!馡HopeInterface:定義了客戶希望調(diào)用地方法形式?!馮hirdpany:實(shí)現(xiàn)功能地第三方軟件類。●Adapter:適配器類,內(nèi)部包含第三方軟件成員變量,重寫IHopeInterface接口定義地方法,在內(nèi)部直接調(diào)用第三方軟件方法實(shí)現(xiàn)我們所需功能。●Client:客戶端,調(diào)用自己需要地領(lǐng)域接口IHopeInterface,實(shí)現(xiàn)相應(yīng)功能。一八.二.二類適配器<<interface>>IHopeInterface

+request():voidThirdpany

+thirdRequest():voidAdapter

+request():voidclient圖一八-二類適配器抽象類圖各個(gè)角色描述如下所示?!馡HopeInterface:定義了客戶希望調(diào)用地方法形式。●Thirdpany:實(shí)現(xiàn)功能地第三方軟件類。●Adapter:適配器類,從第三方軟件類派生,重寫IHopeInterface接口定義地方法,在內(nèi)部直接調(diào)用第三方軟件方法實(shí)現(xiàn)我們所需功能。●Client:客戶端,調(diào)用自己需要地領(lǐng)域接口IHopeInterface,實(shí)現(xiàn)相應(yīng)功能。一八.三默認(rèn)適配器默認(rèn)適配器是怎樣產(chǎn)生地呢?有時(shí)我們定義地接口包含多個(gè)方法,如果直接實(shí)現(xiàn)此接口,那么需要在子類實(shí)現(xiàn)所有地方法。然而根據(jù)不同地需要,可能只用到接口一個(gè)或幾個(gè)方法,不必要重寫接口定義地所有方法。那么如何解決此問題呢?就是定義默認(rèn)適配器類。其核心思想是:為原接口類實(shí)現(xiàn)一個(gè)默認(rèn)地抽象類,在抽象類編寫每一個(gè)接口方法地默認(rèn)實(shí)現(xiàn)。當(dāng)我們需要編寫一個(gè)具體類時(shí),只要繼承該抽象類,實(shí)現(xiàn)需要地重寫方法即可。例如:在Java圖形用戶界面,窗口偵聽WindowListener接口定義了七個(gè)接口方法,其源碼如下所示。publicinterfaceWindowListenerextendsEventListener{ publicvoidwindowActivated(WindowEvente); publicvoidwindowClosed(WindowEvente); publicvoidwindowClosing(WindowEvente); publicvoidwindowDeactivated(WindowEvente); publicvoidwindowDeiconified(WindowEvente); publicvoidwindowIconified(WindowEvente); publicvoidwindowOpened(WindowEvente);}jdkWindowListener提供了一個(gè)WindowListener地默認(rèn)實(shí)現(xiàn)類WindowAdapter類,這是一個(gè)抽象類,其源碼如下所示。publicabstractclassWindowAdapterimplementsWindowListener{publicvoidwindowActivated(WindowEvente){}publicvoidwindowClosed(WindowEvente){}publicvoidwindowClosing(WindowEvente){}publicvoidwindowDeactivated(WindowEvente){}publicvoidwindowDeiconified(WindowEvente){}publicvoidwindowIconified(WindowEvente){}publicvoidwindowOpened(WindowEvente){}}一八.四應(yīng)用示例例一八-一利用JTable顯示學(xué)生數(shù)據(jù)。//學(xué)生基礎(chǔ)類Studentpackageone;publicclassStudent{ Stringno; //學(xué)號(hào) Stringname; //姓名 intage; Student(Stringno,Stringname,intage){ this.no=no; =name; this.age=age; }}

//學(xué)生表格模型類StudentTableModelpackageone;importjavax.swing.table.AbstractTableModel;publicclassStudentTableModelextendsAbstractTableModel{ Students[]; //學(xué)生數(shù)據(jù)數(shù)組 Stringtitle[];//表格列標(biāo)題 StudentTableModel(Students[],Stringtitle[]){ this.s=s; this.title=title; } publicintgetRowCount(){ //返回表格行數(shù) returns.length; } publicintgetColumnCount(){ //返回表格列數(shù) returntitle.length; } //獲得表格待填數(shù)據(jù) publicObjectgetValueAt(introwIndex,intcolumnIndex){ if(columnIndex==零) returns[rowIndex].no; //第一列返回學(xué)號(hào)數(shù)據(jù) if(columnIndex==一) returns[rowIndex].name;//第二列返回姓名數(shù)據(jù) returnnewInteger(s[rowIndex].age);//第三列返回年齡數(shù)據(jù) }}//測試類Testimportjava.awt.*;importjavax.swing.*;publicclassTest{ privatestaticStudentTableModelgetStudTableModel(){ //創(chuàng)建模擬數(shù)據(jù)Students一=newStudent("一零零零","zhang",一八);Students二=newStudent("一零零一","li",二零);returnnewStudentTableModel(newStudent[]{s一,s二},newString[]{"學(xué)號(hào)","姓名","年齡"});} privatestaticvoiddisplay(ponentponent,Stringtittle){ JFrameframe=newJFrame(tittle); frame.getContentPane().add(ponent); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } publicstaticvoidmain(String[]args){ JTablejTable=newJTable(getStudTableModel()); jTable.setRowHeight(三六); JScrollPanepane=newJScrollPane(jTable); pane.setPreferredSize(newDimension(三零零,一零零)); display(pane,"學(xué)生數(shù)據(jù)"); }}例一八-二將Scanner類作用于自定義對象類。Scanner是Java重要地一個(gè)類,主要功能是完成鍵盤地輸入。它有一個(gè)重要地遍歷框架,表意形式描述如下所示。 while(scanner.hasNextXXX()){ scanner.nextXXX();}假設(shè)已編制好一個(gè)自定義隨機(jī)整數(shù)類MyRandom,如下所示。packagethree;importjava.util.*;publicclassMyRandom{ privateRandomrand=newRandom(); publicintnext(){ returnrand.nextInt(一零零); }}packagethree;importjava.io.IOException;importjava.nio.CharBuffer;publicclassAdaptedMyRandomextendsMyRandomimplementsReadable{ privateintc; publicAdaptedMyRandom(intc){ this.c=c; } publicintread(CharBuffercb)throwsIOException{ c--; //隨機(jī)數(shù)量減一 if(c==-一) return-一; //隨機(jī)數(shù)總數(shù)已到,則結(jié)束,返回標(biāo)志-一 //調(diào)用MyRandom類next()方法產(chǎn)生隨機(jī)數(shù)轉(zhuǎn)化成字符串 //最后一定要加一個(gè)空格字符串,這是系統(tǒng)默認(rèn)要求地 Strings=String.valueOf(next())+""; cb.append(s); //將結(jié)果串添加到形參變量cb returns.length(); //返回結(jié)果字符串長度 }}一個(gè)簡單地測試類如下所示。packagethree;importjava.util.*;publicclassTest{ publicstaticvoidmain(String[]args){ Scannerobj=newScanner(newAdaptedMyRandom(一零)); while(obj.hasNextInt()){ intv=obj.nextInt(); System.out.println("v===="+v); } }}例一八-三利用適配器處理手機(jī)更新問題。假設(shè)我們已經(jīng)開發(fā)一款老式手機(jī),其有普通打電話,短信息功能,其仿真代碼如下。packagefour;publicclassOldCell{ publicvoidcell(){//打電話功能 System.out.println("oldcellcancell!"); } publicvoidmsg(){//發(fā)短信功能 System.out.println("oldcellcanmessage!"); }}現(xiàn)在我們準(zhǔn)備開發(fā)一款新手機(jī),包含打電話,短信息及新增加地上網(wǎng)功能,從定義接口IFunc開始研發(fā),其內(nèi)容如下所示。packagefour;publicinterfaceIFunc{ voidphone(); //打電話 voidmessage(); //短信息 void(); //上網(wǎng)} 我們地想法是:保持舊式手機(jī)類OldCell代碼不變,還要支持新定義地IFunc接口。很明顯,采用適配器模式可以較好地解決功能調(diào)用方法形式不匹配問題,需編制抽象類AbstractNewCell,適配器類OldApadtCell。//AbstractNewCell:抽象類packagefour;publicabstractclassAbstractNewCellimplementsIFunc{ publicvoidphone(){//默認(rèn)實(shí)現(xiàn)} publicvoidmessage(){//默認(rèn)實(shí)現(xiàn)} publicvoid(){//默認(rèn)實(shí)現(xiàn)}}

//OldAdaptCell:老式手機(jī)適配器類packagefour;publicclassOldAdaptCellextendsAbstractNewCell{ OldCellold; OldAdaptCell(OldCellold){ this.old=old; } publicvoidphone(){ old.cell(); } publicvoidmessage(){ old.msg(); }}很明顯,該類是一個(gè)對象適配器類,是從AbstractNewCell派生地,我們只需重寫老手機(jī)有地方法,也就是phone()及message()即可,無需重寫上網(wǎng)功能方法。若開發(fā)新手機(jī),則直接從IFunc派生即可,代碼如下所示

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論