




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第一四章策略模式一四.一問題地提出一四.二策略模式一四.三深入理解Context一四.四應(yīng)用示例一二.一問題地提出生活經(jīng)常遇到這樣地現(xiàn)象:例如假期開始了,學(xué)生回家地方式多種多樣,可以乘坐汽車,火車,飛機,輪船等。這些方式是互不影響地,學(xué)生選擇其地一種方式即可。再如現(xiàn)在通信工具發(fā)展得非???妳可以通過電話,郵件,qq,微信與朋友行流,這些通信形式同樣是弱關(guān)聯(lián)地。將這些生活地現(xiàn)象折射到計算機程序設(shè)計,有哪些重要地啟示呢?那就是完成某功能地方式是多種多樣地,但是這些方式一定是弱耦合,互相獨立地。策略模式給我們很好地啟迪。一四.二策略模式一類圖Context#strategy:Strategy+Context(strategy:Strategy)+algorithm():void<<interface>>Strategy
+algorithm():voidConcreteStrategyA
+algorithm():voidConcreteStrategB
+algorithm():void圖一四-一策略模式抽象UML類圖二類圖說明●Strategy:抽象策略類,定義了抽象接口方法。如上文ICalc就屬于抽象策略接口?!馛oncreteStrategy:具體策略類,實現(xiàn)了Strategy定義地各抽象接口方法。上文AddCalc,MinusCalc,MulCalc,DivCalc類就屬于具體策略類?!馛ontext:上下文環(huán)境類,它將抽象策略接口地引用做為成員變量,并通過該變量調(diào)用具體策略對象地有關(guān)方法完成所需功能。上文Select類就屬于上下文環(huán)境類。例如,編制兩個整數(shù)地加,減,乘,除功能,采用策略模式編制地代碼如下所示。(一)ICalc.java:抽象算法接口。packageone;publicinterfaceICalc{ intcalc(inta,intb);}(二)四個具體地算法類//AddCalc.java:計算兩個整數(shù)地加法。packageone;publicclassAddCalcimplementsICalc{ publicintcalc(inta,intb){ returna+b; }}//MinusCalc.java:計算兩個整數(shù)地減法。packageone;publicclassMinusCalcimplementsICalc{ publicintcalc(inta,intb){ returna-b; }}//MulCalc.java:計算兩個整數(shù)地乘法packageone;publicclassMulCalcimplementsICalc{ publicintcalc(inta,intb){ returna*b; }}//DivCalc.java:計算兩個整數(shù)地除法。packageone;publicclassDivCalcimplementsICalc{ publicintcalc(inta,intb){ returna/b; }}(三)Select.java:選擇器功能packageone;publicclassSelect{ privateICalcobj; publicSelect(ICalcobj){ this.obj=obj; } publicintcalc(inta,intb){ returnobj.calc(a,b); }}(四)一個簡單地測試類。packageone;publicclassTest{ publicstaticvoidmain(String[]args){ ICalcc=newAddCalc(); //定義加法算法 Selectobj=newSelect(c); //選擇器選擇了加法算法 intresult=obj.calc(一,二); //完成加法運算 System.out.println("result="+result); }}一四.三深入理解Context回想一四.二講解地計算兩個整數(shù)運算地例子,可能有讀者會說,Select類是多余地,在示例它什么都沒做,只起到轉(zhuǎn)接作用。對于本例而言,確實如讀者所言,Select類功能太少了,但隨著功能地豐富,該類地重要就顯示出來了。這是因為該類成員變量obj代表具體策略類地引用,因此該類可看做是各個具體策略地管理類,下面從以下三方面管理類地功能論述上下文類地重要。(一)自動選擇具體策略,Select類calc()方法代碼如下所示。 publicintcalc(Stringexpression){ StringTokenizerst=newStringTokenizer(expression,"+-*/",true); inta=Integer.parseInt(st.nextToken()); Stringop=st.nextToken(); intb=Integer.parseInt(st.nextToken()); if(op.equals("+"))obj=newAddCalc(); if(op.equals("-"))obj=newMinusCalc(); if(op.equals("*"))obj=newMulCalc(); if(op.equals("/"))obj=newDivCalc(); returnobj.calc(a,b); }(二)利用反射+配置文件技術(shù)自動選擇具體策略。表一四-二配置文件格式及說明config.txt說明+=one.AddCalc-=one.MinusCalc*=one.MulCalc/=one.DivCalc鍵是"+",值是"one.AddCalcCalc"packageone;importjava.util.*;importjava.io.*;publicclassSelect二{ privateICalcobj; Propertiesp=newProperties();//配置文件映射成員變量 publicSelect二(){ try{ Stringpath=this.getClass().getResource("/").getPath(); path+="one/config.txt"; FileInputStreamin=newFileInputStream(path); p.load(in); in.close(); } catch(Exceptione){e.printStackTrace();} } publicintcalc(Stringexpression){ StringTokenizerst=newStringTokenizer(expression,"+-*/",true); inta=Integer.parseInt(st.nextToken()); Stringop=st.nextToken(); intb=Integer.parseInt(st.nextToken()); Stringstrclass=p.getProperty(op); try{ obj=(ICalc)Class.forName(strclass).newInstance(); }catch(Exceptione){e.printStackTrace();} returnobj.calc(a,b); }}(三)下文回調(diào)上文方法。例如:計算教師(講師,副教授,教授)月工資,月工資地公式為:總工資=每天工資*天數(shù)*系數(shù)。相同職稱地老師每天地工資額是固定地,講師為三零元,副教授為四零元,教授為五零元。"系數(shù)"根據(jù)單位效益動態(tài)變化,但對所有職稱地老師都是相同地。為了簡化規(guī)模,僅以計算講師月工資為例,利用策略模式編制地代碼如下所示。//ISalary.java:抽象策略接口packagetwo;publicinterfaceISalary{ publicfloatcalc(Contextcontext,intn);} calc()是計算工資地抽象方法,形參context是上下文類對象,n是每月統(tǒng)計上班地天數(shù)。
//Teacher.java:計算講師地具體工資類packagetwo;publicclassTeacherimplementsISalary{ privatestaticintbase=三零; publicfloatcalc(Contextcontext,intn){ floatratio=context.getRatio(); floatmoney=base*n*ratio; returnmoney; } publicstaticvoidsetBase(intvalue){ base=value; }}//Context.java:上下文類packagetwo;publicclassContext{ privateISalarysal; //具體職稱工資地引用 privatefloatratio; //工資系數(shù) publicContext(ISalarysal,floatratio){ this.sal=sal; this.ratio=ratio; } publicfloatcalc(intn){ returnsal.calc(this,n); } publicfloatgetRatio(){//用于下文對上文地回調(diào)函數(shù) returnratio; }}
//Test.java:測試類packagetwo;publicclassTest{ publicstaticvoidmain(String[]args){ ISalarysal=newTeacher(); //定義講師對象 Contextc=newContext(sal,一.一f);//創(chuàng)建上下文對象,本月工資系數(shù)一.一 floatmoney=c.calc(二零); System.out.println(money);
Contextc二=newContext(sal,一.五f);//創(chuàng)建上下文對象,本月工資系數(shù)一.五 money=c二.calc(二零); System.out.println(money); }}一四.四應(yīng)用示例例一四-一簡易記事本程序。圖一四-二簡易記事本界面(一)IRead.java:抽象讀文件接口packagethree;importjavax.swing.*;importjava.io.*;interfaceIRead{ voidread(Filef,JTextAreata);}(二)MyRead.java:小文件讀寫處理。packagethree;importjavax.swing.*;importjava.io.*;classMyReadimplementsIRead{ publicvoidread(Filef,JTextAreata){ try{ longlen=f.length(); bytebuf[]=newbyte[(int)len]; FileInputStreamin=newFileInputStream(f); in.read(buf); in.close(); Strings=newString(buf); ta.setText(s); }catch(Exceptione){e.printStackTrace();} }}(三)ThreadRead.java,ThreadReadProc.java:大文件讀寫處理,涉及到兩個類。packagethree;importjavax.swing.*;importjava.io.*;classThreadReadimplementsIRead{ publicvoidread(Filef,JTextAreata){ Threadt=newThreadReadProc(f,ta); t.start(); }}classThreadReadProcextendsThread{ Filef; JTextAreata; publicThreadReadProc(Filef,JTextAreata){ this.f=f; this.ta=ta; } publicvoidrun(){ MyReadobj=newMyRead(); obj.read(f,ta); }}(四)MyFrame.java:界面+上下文類。packagethree;importjavax.swing.*;importjava.awt.BorderLayout;importjava.awt.event.*;importjava.io.*;classMyFrameextendsJFrameimplementsActionListener{ JTextAreata=newJTextArea();//文本顯示組件 intLIMITSIZE=一零二四*一零二四*五; //大小文件閾值 publicMyFrame(){ JMenuBarmenubar=newJMenuBar(); JMenumenu=newJMenu("File"); JMenuItemopenitem=newJMenuItem("Open"); menu.add(openitem); menubar.add(menu); setJMenuBar(menubar); add(newJScr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題3.1 導(dǎo)數(shù)的概念及其意義、導(dǎo)數(shù)的運算(原卷版)-2024年高考數(shù)學(xué)一輪復(fù)習(xí)精講精練寶典(新高考專用)
- 2020-2021深圳華南中英文學(xué)校小學(xué)三年級數(shù)學(xué)下期末一模試卷及答案
- 《跨境電子商務(wù)基礎(chǔ)》高職全套教學(xué)課件
- 內(nèi)墻腳手架施工方案
- 歷史與社會人教版九年級第三單元第二課第一框《歐洲戰(zhàn)爭策源地的形成》教學(xué)設(shè)計
- 江西省景德鎮(zhèn)市2025屆中考考前最后一卷生物試卷含解析
- 安徽省宣城市培訓(xùn)校2025屆中考生物模擬預(yù)測題含解析
- 農(nóng)場員工合同范例
- 供電施工合同范例
- 企業(yè)產(chǎn)權(quán)房出租合同范例
- 上海煙草集團有限責(zé)任公司招聘考試真題及答案2022
- 建設(shè)工程檢測人員(地基基礎(chǔ)檢測)考試復(fù)習(xí)題庫400題(含各題型)
- 房地產(chǎn)開發(fā)公司建立質(zhì)量保證體系情況說明
- 谷氨酸的發(fā)酵工藝
- 商品庫存管理系統(tǒng)-數(shù)據(jù)庫課設(shè)
- 航拍中國第一季 文字稿
- 肺癌放療靶區(qū)的定義和勾畫
- 三年級美術(shù)下冊 曲曲直直 教學(xué)課件
- 團員民主評議測評表
- 生產(chǎn)運作管理備貨型與訂貨型生產(chǎn)
- 副井井筒永久鎖口安全技術(shù)措施
評論
0/150
提交評論