設(shè)計模式策略模式_第1頁
設(shè)計模式策略模式_第2頁
設(shè)計模式策略模式_第3頁
設(shè)計模式策略模式_第4頁
設(shè)計模式策略模式_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論