版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二三章外觀模式二三.一問題地提出二三.二適配器模式二三.三應用示例二三.一問題地提出一個大地系統一般都是由若干個子系統構成。例如冰箱由冷凍室與冷藏室構成,冷凍室,冷藏室都有初始化,運行,關機三個主要過程。描述冷藏室,冷凍室地功能類代碼如下所示。classContainer{ //冷藏室功能類 publicvoidinit(){//初始化 System.out.println("Containerinit"); } publicvoidrun(){ //運行 System.out.println("Containerrun"); } publicvoidshutdown(){//關機 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)建冷藏室對象 Freezerf=newFreezer(); //創(chuàng)建冷凍室對象 c.init();f.init(); //分別初始化仿真 c.run();f.run(); //分別運行仿真 c.shutdown();f.shutdown(); //分別關閉仿真 }}從main()方法看出,所有功能類都暴露在其,這不是設計模式地風格,如何改呢?外觀模式給我們提供了一個較好地解決策略。二三.二外觀模式一類圖ClientFacade功能類一功能類n……
subsystem圖二三-一外觀模式抽象類圖各個角色描述如下所示?!馞a?ade:門面角色,外觀模式地核心。它被客戶角色調用,它熟悉子系統地功能。內部根據客戶角色地需求預定了幾種功能地組合?!馭ubsystem:子系統角色,實現了子系統地功能。它對客戶角色與Facade時未知地。它內部可以有系統內地相互互,也可以由供外界調用地接口?!馛lient:客戶角色,通過調用Facede來完成要實現地功能。二三.三應用示例例二三-一利用外觀模式封裝銀行業(yè)務。 為了減小問題規(guī)模,我們僅模擬一個(比如小張)地銀行業(yè)務功能。假設小張有兩張銀行卡,分別是工商銀行與建設銀行地銀行卡。我們仿真實現地包括如下功能:①可以向任意銀行卡存錢;②可以從任意卡取錢;③可以從一張銀行卡向另一張銀行卡轉賬。 很明顯,功能類有一個銀行類Bank即可,外觀類BankFacade需要實現上述①~③地所有功能。所需編制地功能類如下所示。(一)Bank.java:銀行功能類。publicclassBank{ Stringmark; //銀行標識 StringNO; //賬號 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(五零); //工行向建行轉賬五零元 fa.displayICBC(); //顯示工行卡信息 fa.displayCCB(); //顯示建行卡信息 }}有一個問題值得思考:若小張有一零張銀行卡,仍要實現表二三-一所述功能,所需函數規(guī)模會迅速膨脹。以銀行轉賬功能為例,一零張銀行卡有四五種轉賬方式,難道需要定義四五個方法?很明顯這是不現實地,需要要改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()); } }}一個測試類如下所示。publicclassTest{ publicstaticvoidmain(String[]args){ BankFacadefa=newBankFacade(); fa.save("ICBC",一零零); //向工行存一零零元 fa.display(); //顯示 fa.save("CCB",二零零); //向建行存二零零元 fa.display(); //顯示 fa.fromAndTo("ICBC",五零,"CCB");//工行向建行轉賬五零元 fa.display(); }}例二三-二利用外觀模式封裝字符串信息。已知兩個功能類ReadFile,TextInfo。ReadFile類用來讀文本文件,TextInfo用于對字符串操作。這兩個類是編制外觀功能類地前提,其代碼如下所示。//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:對英文文本字節(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()); }}現在我們要求利用ReadFile,TextInfo兩個類實現下述功能:①顯示英文文本文件有多少個單詞;②顯示英文文本文件有多少個不重復地單詞;③顯示英文文本文件不重復單詞內容及出現次數。很明顯,應用外觀模式封裝上文①~③地功能是一個較好地選擇,其外觀模式類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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市政設施維護保養(yǎng)制度
- 綠化工程公司經營管理制度
- 合浦縣西場漁光互補一期光伏發(fā)電項目配套220千伏送出線路工程環(huán)境影響報告表
- 2026年東營河口區(qū)事業(yè)單位公開招聘工作人員(21人)筆試備考試題及答案解析
- 2026內蒙古鄂爾多斯市合創(chuàng)控股集團有限公司招聘6人筆試備考題庫及答案解析
- 2026中央機關遴選和選調公務員調劑筆試備考題庫及答案解析
- 2026廣東江門市新會區(qū)基業(yè)資產經營有限公司招聘1人筆試模擬試題及答案解析
- 2026德安縣消防大隊招聘2人筆試參考題庫及答案解析
- 2026陜西西安交通大學電工材料電氣絕緣全國重點實驗室特聘教授秘書招聘1人筆試備考題庫及答案解析
- 2026國家電投集團河北公司(雄安公司)招聘2人筆試備考題庫及答案解析
- 專題五 以新發(fā)展理念引領高質量發(fā)展
- vpap iv st說明總體操作界面
- 2023人事年度工作計劃七篇
- LY/T 1692-2007轉基因森林植物及其產品安全性評價技術規(guī)程
- GB/T 20145-2006燈和燈系統的光生物安全性
- 長興中學提前招生試卷
- 安全事故案例-圖片課件
- 螺紋的基礎知識
- 蜂窩煤成型機課程設計說明書
- 生物統計學(課堂PPT)
- 腫瘤內科中級分章試題精選
評論
0/150
提交評論