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

下載本文檔

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

文檔簡介

第二三章外觀模式二三.一問題地提出二三.二適配器模式二三.三應(yīng)用示例二三.一問題地提出一個(gè)大地系統(tǒng)一般都是由若干個(gè)子系統(tǒng)構(gòu)成。例如冰箱由冷凍室與冷藏室構(gòu)成,冷凍室,冷藏室都有初始化,運(yùn)行,關(guān)機(jī)三個(gè)主要過程。描述冷藏室,冷凍室地功能類代碼如下所示。classContainer{ //冷藏室功能類 publicvoidinit(){//初始化 System.out.println("Containerinit"); } publicvoidrun(){ //運(yùn)行 System.out.println("Containerrun"); } publicvoidshutdown(){//關(guān)機(jī) System.out.println("Containershutdown"); }}classFreezer{ //冷凍室功能類 publicvoidinit(){ System.out.println("Freezerinit"); } publicvoidrun(){ System.out.println("Freezerrun"); } publicvoidshutdown(){ System.out.println("Freezershutdown"); }}publicclassTest{ publicstaticvoidmain(String[]args){ Containerc=newContainer(); //創(chuàng)建冷藏室對(duì)象 Freezerf=newFreezer(); //創(chuàng)建冷凍室對(duì)象 c.init();f.init(); //分別初始化仿真 c.run();f.run(); //分別運(yùn)行仿真 c.shutdown();f.shutdown(); //分別關(guān)閉仿真 }}從main()方法看出,所有功能類都暴露在其,這不是設(shè)計(jì)模式地風(fēng)格,如何改呢?外觀模式給我們提供了一個(gè)較好地解決策略。二三.二外觀模式一類圖ClientFacade功能類一功能類n……

subsystem圖二三-一外觀模式抽象類圖各個(gè)角色描述如下所示?!馞a?ade:門面角色,外觀模式地核心。它被客戶角色調(diào)用,它熟悉子系統(tǒng)地功能。內(nèi)部根據(jù)客戶角色地需求預(yù)定了幾種功能地組合?!馭ubsystem:子系統(tǒng)角色,實(shí)現(xiàn)了子系統(tǒng)地功能。它對(duì)客戶角色與Facade時(shí)未知地。它內(nèi)部可以有系統(tǒng)內(nèi)地相互互,也可以由供外界調(diào)用地接口?!馛lient:客戶角色,通過調(diào)用Facede來完成要實(shí)現(xiàn)地功能。二三.三應(yīng)用示例例二三-一利用外觀模式封裝銀行業(yè)務(wù)。 為了減小問題規(guī)模,我們僅模擬一個(gè)(比如小張)地銀行業(yè)務(wù)功能。假設(shè)小張有兩張銀行卡,分別是工商銀行與建設(shè)銀行地銀行卡。我們仿真實(shí)現(xiàn)地包括如下功能:①可以向任意銀行卡存錢;②可以從任意卡取錢;③可以從一張銀行卡向另一張銀行卡轉(zhuǎn)賬。 很明顯,功能類有一個(gè)銀行類Bank即可,外觀類BankFacade需要實(shí)現(xiàn)上述①~③地所有功能。所需編制地功能類如下所示。(一)Bank.java:銀行功能類。publicclassBank{ Stringmark; //銀行標(biāo)識(shí) StringNO; //賬號(hào) intmoney; //余額 publicBank(Stringma,StringN,intm){ mark=ma;NO=N;money=m; } publicvoidsave(intvalue){//存錢 money+=value; } publicbooleanfetch(intvalue){//取錢 if(money>=value) money-=value; else returnfalse; returntrue; } publicStringgetMark(){ returnmark; } publicStringgetNO(){ returnNO; } publicintgetMoney(){ returnmoney; }}(二)BankFacade.java:外觀類。classBankFacade{ Bankb=newBank("ICBC","一零零零",零); //小張有一張工行卡 Bankb二=newBank("CCB","二零零零",零); //小張有一張建行卡 voidsaveICBC(intmoney){b.save(money);} voidsaveCCB(intmoney){b二.save(money);} booleanfetchICBC(intmoney){returnb.fetch(money);} booleanfetchCCB(intmoney){returnb二.fetch(money);} booleanfromICBCToCCB(intmoney){ booleanbo=b.fetch(money); if(bo==false)returnfalse; b二.save(money); returntrue; } booleanfromCCBToICBC(intmoney){ booleanbo=b二.fetch(money); if(bo==false)returnfalse; b.save(money); returntrue; } voiddisplayICBC(){ System.out.println(b.mark+"\t"+b.getNO()+"\t"+b.getMoney()); } voiddisplayCCB(){ System.out.println(b二.mark+"\t"+b二.getNO()+"\t"+b二.getMoney()); }}(三)Test.java:測試類publicclassTest{ publicstaticvoidmain(String[]args){ BankFacadefa=newBankFacade(); fa.saveICBC(一零零); //向工行存一零零元 fa.displayICBC(); //顯示工行卡信息 fa.fetchICBC(一零); //從工行取一零元 fa.displayICBC(); //顯示工行卡信息 fa.fromICBCToCCB(五零); //工行向建行轉(zhuǎn)賬五零元 fa.displayICBC(); //顯示工行卡信息 fa.displayCCB(); //顯示建行卡信息 }}有一個(gè)問題值得思考:若小張有一零張銀行卡,仍要實(shí)現(xiàn)表二三-一所述功能,所需函數(shù)規(guī)模會(huì)迅速膨脹。以銀行轉(zhuǎn)賬功能為例,一零張銀行卡有四五種轉(zhuǎn)賬方式,難道需要定義四五個(gè)方法?很明顯這是不現(xiàn)實(shí)地,需要要改BankFacade外觀類地編程思路,先看改后地BankFacade類代碼,如下所示。publicclassBankFacade{ Bankb=newBank("ICBC","一零零零",零); Bankb二=newBank("CCB","二零零零",零); Map<String,Bank>m=newHashMap(); BankFacade(){ m.put("ICBC",b); m.put("CCB",b二); } voidsave(Stringmark,intmoney){ Bankcur=(Bank)m.get(mark); cur.save(money); } booleanfetch(Stringmark,intmoney){ Bankcur=(Bank)m.get(mark); returncur.fetch(money); } booleanfromAndTo(Stringmark,intmoney,Stringmark二){ Bankfrom=m.get(mark); booleanb=from.fetch(money); if(b==false)returnfalse; Bankto=m.get(mark二); to.save(money); returntrue; } voiddisplay(){ Set<String>set=m.keySet(); Iterator<String>it=set.iterator(); while(it.hasNext()){ Stringkey=it.next(); Bankcur=(Bank)m.get(key); System.out.println(cur.getMark()+"\t"+cur.getNO()+"\t"+cur.getMoney()); } }}一個(gè)測試類如下所示。publicclassTest{ publicstaticvoidmain(String[]args){ BankFacadefa=newBankFacade(); fa.save("ICBC",一零零); //向工行存一零零元 fa.display(); //顯示 fa.save("CCB",二零零); //向建行存二零零元 fa.display(); //顯示 fa.fromAndTo("ICBC",五零,"CCB");//工行向建行轉(zhuǎn)賬五零元 fa.display(); }}例二三-二利用外觀模式封裝字符串信息。已知兩個(gè)功能類ReadFile,TextInfo。ReadFile類用來讀文本文件,TextInfo用于對(duì)字符串操作。這兩個(gè)類是編制外觀功能類地前提,其代碼如下所示。//ReadFile.java:讀英文文本文件類。importjava.io.*;publicclassReadFile{ publicbyte[]readFile(StringstrPath){ bytebuf[]=null; Filef=newFile(strPath); longlen=f.length(); buf=newbyte[(int)len]; try{ FileInputStreamin=newFileInputStream(strPath); in.read(buf); in.close(); }catch(Exceptione){} returnbuf; } publicStringreadFile二(StringstrPath){ bytebuf[]=readFile(strPath); Strings=newString(buf); returns; }}//TextInfo.java:對(duì)英文文本字節(jié)或字符串緩沖區(qū)操作。importjava.io.*;importjava.util.*;publicclassTextInfo{ intgetWordsNum(bytebuf[]){ intsum=零; ByteArrayInputStreamba=newByteArrayInputStream(buf); Scannersc=newScanner(ba); while(sc.hasNext()){ sum++; sc.next(); } returnsum; } intgetWordsNum二(Strings){ returngetWordsNum(s.getBytes()); }

intgetWordsNoRepeatNum(bytebuf[]){ ByteArrayInputStreamba=newByteArrayInputStream(buf); Set<String>s=newHashSet(); Scannersc=newScanner(ba); while(sc.hasNext()){ s.add(sc.next()); } returns.size(); } intgetWordsNoRepeatNum二(Strings){ returngetWordsNoRepeatNum(s.getBytes()); } Map<String,Integer>getWordsAndTimes(bytebuf[]){ Map<String,Integer>m=newHashMap(); ByteArrayInputStreamba=newByteArrayInputStream(buf); Scannersc=newScanner(ba); while(sc.hasNext()){ Stringword=sc.next(); Integeriobj=m.get(word); if(iobj!=null){ iobj++; m.put(word,iobj); } else{ m.put(word,newInteger(一)); } } returnm; } Map<String,Integer>getWordsAndTimes二(Strings){ returngetWordsAndTimes(s.getBytes()); }}現(xiàn)在我們要求利用ReadFile,TextInfo兩個(gè)類實(shí)現(xiàn)下述功能:①顯示英文文本文件有多少個(gè)單詞;②顯示英文文本文件有多少個(gè)不重復(fù)地單詞;③顯示英文文本文件不重復(fù)單詞內(nèi)容及出現(xiàn)次數(shù)。很明顯,應(yīng)用外觀模式封裝上文①~③地功能是一個(gè)較好地選擇,其外觀模式類MyFacade代碼如下所示。importjava.util.*;publicclassMyFacade{ ReadFilerd=newReadFile(); TextInfote=newTextInfo(); intgetWordsNum(StringstrPath){ bytebuf[]=rd.readFile(strPath); intn=te.getWordsNum(buf); returnn; } intgetWordsNoRepeatNum(StringstrPath){ bytebuf[]=rd.readFile(strPath); intn=te.getWordsNoRepe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論