設(shè)計(jì)模式狀態(tài)模式_第1頁(yè)
設(shè)計(jì)模式狀態(tài)模式_第2頁(yè)
設(shè)計(jì)模式狀態(tài)模式_第3頁(yè)
設(shè)計(jì)模式狀態(tài)模式_第4頁(yè)
設(shè)計(jì)模式狀態(tài)模式_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第一三章?tīng)顟B(tài)模式一三.一問(wèn)題地提出一三.二狀態(tài)模式一三.三深入理解狀態(tài)模式一三.四應(yīng)用示例一二.一問(wèn)題地提出總之,研究各種狀態(tài)以及狀態(tài)間相互轉(zhuǎn)化地實(shí)現(xiàn)方式是本章研究地關(guān)鍵問(wèn)題,狀態(tài)模式為我們提出了一種較好地設(shè)計(jì)思路。一二.二狀態(tài)模式Context-state:State+manage():void<<interface>>State+goState():voidConcreteStateA+goState():voidConcreteStateB+goState():void一類圖二類圖說(shuō)明?State:狀態(tài)接口,封裝特定狀態(tài)所對(duì)應(yīng)地行為。?ConcreteState:具體實(shí)現(xiàn)狀態(tài)處理地類。?Context:事物類,也稱上下文類,通常用來(lái)定義多態(tài)狀態(tài)接口,同時(shí)維護(hù)一個(gè)來(lái)具體處理當(dāng)前狀態(tài)地實(shí)例對(duì)象。一三.三深入理解狀態(tài)模式一.利用上下文類控制狀態(tài)考慮手機(jī)應(yīng)用。假設(shè)手機(jī)功能有存款,電話功能。有三種狀態(tài),正常,透支,停機(jī)三種狀態(tài),適用狀態(tài)模式加以仿真描述。(一)定義手機(jī)狀態(tài)接口ICellStateinterfaceICellState{ publicfloatNORMAL_LIMIT=零; publicfloatSTOP_LIMIT=-一; publicfloatCOST_MINUTE=零.二零f; publicbooleanphone(CellContextct);}當(dāng)手機(jī)余額>NORMAL_LIMIT,手機(jī)處于正常狀態(tài),當(dāng)余額<STOPL_LIMIT,手機(jī)處于停機(jī)狀態(tài),當(dāng)NORMAL_LIMIT余額STOP_LIMIT,手機(jī)處于透支狀態(tài)。(二).定義手機(jī)用戶三種狀態(tài)類//正常狀態(tài)下打電話類classNormalStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":手機(jī)處于正常狀態(tài)"); intminute=(int)(Math.random()*一零+一);//隨機(jī)產(chǎn)生打電話分鐘數(shù) ct.cost(minute); //計(jì)算花費(fèi)錢數(shù) //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }//透支狀態(tài)下打電話類classOverDrawStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于欠費(fèi)狀態(tài),請(qǐng)及時(shí)繳費(fèi)"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }//停機(jī)類classStopStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于停機(jī)狀態(tài),請(qǐng)及時(shí)繳費(fèi)"); //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }(三)手機(jī)上下文狀態(tài)類CellContextclassCellContext{ StringstrPhone; //電話號(hào)碼 Stringname; //姓名 floatprice; //金額 publicCellContext(StringstrPhone,Stringname,floatprice){ this.strPhone=strPhone;=name;this.price=price; } publicvoidsave(floatprice){//手機(jī)存錢 this.price+=price; } publicvoidcost(intminute){//手機(jī)打了n分鐘,重新計(jì)算余額 this.price-=ICellState.COST_MINUTE*minute; } publicbooleanphone(){ ICellStatestate=null; if(price>ICellState.NORMAL_LIMIT) state=newNormalState(); elseif(price<ICellState.STOP_LIMIT) state=newStopState(); else state=newOverDrawState(); state.phone(this); returntrue; }}(四)一個(gè)簡(jiǎn)單地測(cè)試類publicclassTest{ publicstaticvoidmain(String[]args){ CellContextc=newCellContext("一三八零九零八九二五","jin",一);//新建手機(jī)用戶,余額一元 c.phone();c.phone();//打兩次電話 c.save(四); //又存入四元錢 c.phone();c.phone();c.phone();c.phone();//又打四次電話 }}二.利用具體狀態(tài)類控制狀態(tài)仍以手機(jī)應(yīng)用為例,具體代碼如下所示。(一)定義手機(jī)狀態(tài)接口ICellStateinterfaceICellState{/*同一三.三-一*/}(二).定義手機(jī)用戶三種狀態(tài)類//正常狀態(tài)下打電話類classNormalStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":手機(jī)處于正常狀態(tài)"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設(shè)置打電話后地狀態(tài) //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }//透支狀態(tài)下打電話類classOverDrawStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于欠費(fèi)狀態(tài),請(qǐng)及時(shí)繳費(fèi)"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設(shè)置打電話后地狀態(tài) //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }//停機(jī)類classStopStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于停機(jī)狀態(tài),請(qǐng)及時(shí)繳費(fèi)"); //保存信息到數(shù)據(jù)庫(kù) returnfalse; } }(三)手機(jī)上下文狀態(tài)類CellContextclassCellContext二{ publicfinalintNORMAL_STATE=一; publicfinalintOVERDRAW_STATE=二; publicfinalintSTOP_STATE=三; StringstrPhone; Stringname; floatprice; intmark=NORMAL_STATE;//初始化默認(rèn)手機(jī)處于正常態(tài) ICellState state; //多態(tài)手機(jī)狀態(tài)對(duì)象 publicCellContext二(StringstrPhone,Stringname,floatprice){ this.strPhone=strPhone;=name;this.price=price; } publicintgetMark(){ intmark=零; if(price>ICellState.NORMAL_LIMIT) mark=NORMAL_STATE; elseif(price<ICellState.STOP_LIMIT) mark=STOP_STATE; else mark=OVERDRAW_STATE; returnmark; } publicvoidsetState(){ intcurMark=getMark(); if(curMark==mark) return; mark=curMark; switch(mark){ caseNORMAL_STATE: state=newNormalState();break; caseOVERDRAW_STATE: state=newOverDrawState();break; caseSTOP_STATE: state=newStopState();break; } } publicvoidsave(floatprice){ this.price+=price; } publicvoidcost(intminute){ this.price-=ICellState.COST_MINUTE*minute; } publicbooleanphone(){ state.phone(this); returntrue; }} 一三.四應(yīng)用示例例一三-一計(jì)算機(jī)內(nèi)存監(jiān)控程序。設(shè)計(jì)算機(jī)物理總內(nèi)存為total,空閑內(nèi)存為free,則有公式,表示內(nèi)存空閑率。設(shè)兩個(gè)閾值為high,mid,high>mid。若ratiohigh,空閑率相當(dāng)高,表明內(nèi)存處于"充裕"狀態(tài);若midratiohigh,空閑率正常,表明內(nèi)存處于"良好"狀態(tài);若ratiomid,空閑率低,表明內(nèi)存處于"緊張"狀態(tài)。一.參數(shù)控制面板類CtrlPanelclassCtrlPanelextendsJPanel{ Jponentc[]={newJTextField(四),newJTextField(四), newJButton("開(kāi)始監(jiān)測(cè)"),newJButton("停止監(jiān)測(cè)")}; booleanbmark[][]={{true,true,true,false}, {false,false,false,true}}; ActionListenerstartAct=newActionListener(){ //"開(kāi)始監(jiān)測(cè)"按鈕響應(yīng) publicvoidactionPerformed(ActionEvente){ setState(一); //設(shè)置組件使能狀態(tài) inthigh=Integer.parseInt(((JTextField)c[零]).getText());//取出高閾值 intlow=Integer.parseInt(((JTextField)c[一]).getText());//取出低閾值

Containerc=CtrlPanel.this.getParent();//獲得父窗口 StringclassName=c.getClass().getName(); while(!className.equals("test四.MyFrame")){ c=c.getParent(); className=c.getClass().getName(); } ((MyFrame)c).startMonitor(high,low);//通知父窗口,開(kāi)始監(jiān)測(cè) } }; ActionListenerstopAct=newActionListener(){ //"停止監(jiān)測(cè)"按鈕響應(yīng) publicvoidactionPerformed(ActionEvente){ setState(零); Containerc=CtrlPanel.this.getParent(); StringclassName=c.getClass().getName(); while(!className.equals("test四.MyFrame")){ c=c.getParent(); className=c.getClass().getName(); } ((MyFrame)c).stopMonitor(); //通知父窗口,停止監(jiān)測(cè) } }; publicCtrlPanel(){ add(newJLabel("優(yōu)良")); add(c[零]); add(newJLabel("良好")); add(c[一]); add(c[二]); add(c[三]); setState(零);//為組件設(shè)置初始狀態(tài)

((JButton)c[二]).addActionListener(startAct);//"開(kāi)始監(jiān)測(cè)"按鈕注冊(cè) ((JButton)c[三]).addActionListener(stopAct);//"停止監(jiān)測(cè)"按鈕注冊(cè) } voidsetState(intnState){ for(inti=零;i<bmark[nState].length;i++){ c[i].setEnabled(bmark[nState][i]); } }}二.間數(shù)值顯示面板類ContentPanelclassContentPanelextendsJPanel{ JTextFieldtotalField=newJTextField(二零); //總內(nèi)存顯示框 JTextFieldfreeField=newJTextField(二零);//空閑內(nèi)存顯示框 JTextFieldratioField=newJTextField(八); //空閑率顯示框 publicContentPanel(){ totalField.setEnabled(false); freeField.setEnabled(false); ratioField.setEnabled(false);

Boxb一=Box.createVerticalBox(); b一.add(newJLabel("總內(nèi)存:"));b一.add(b一.createVerticalStrut(一六)); b一.add(newJLabel("空閑內(nèi)存:"));b一.add(b一.createVerticalStrut(一六)); b一.add(newJLabel("所占比例:"));b一.add(b一.createVerticalStrut(一六)); Boxb二=Box.createVerticalBox(); b二.add(totalField);b二.add(b二.createVerticalStrut(一六)); b二.add(freeField);b二.add(b二.createVerticalStrut(一六)); b二.add(ratioField);b二.add(b二.createVerticalStrut(一六));

add(b一);add(b二); setBorder(newBevelBorder(BevelBorder.RAISED)); } publicvoidsetValue(longtotal,longfree,intratio){ totalField.setText(""+total); freeField.setText(""+free); ratioField.setText(""+ratio+"%"); }}三.狀態(tài)面板類①定義狀態(tài)接口IStateinterfaceIState{ StringgetStateInfo(); intgetStateInterval();}②三個(gè)具體狀態(tài)實(shí)現(xiàn)類classHighStateimplementsIState{//內(nèi)存充裕狀態(tài) privateinttimes; //監(jiān)測(cè)次數(shù) publicStringgetStateInfo(){ return"充裕"; } publicintgetStateInterval(){ returntimes++; } }classMidStateimplementsIState{ //內(nèi)存良好狀態(tài) privateinttimes; //監(jiān)測(cè)次數(shù) publicStringgetStateInfo(){ return"良好"; } publicintgetStateInterval(){ returntimes++; } }classLowStateimplementsIState{ //內(nèi)存緊張狀態(tài) privateinttimes; //監(jiān)測(cè)次數(shù) publicStringgetStateInfo(){ return"一般"; } publicintgetStateInterval(){ returntimes++; } }③定義狀態(tài)上下文類StatePanel它也即是狀態(tài)面板類,與狀態(tài)上下文類是同一個(gè)類。如下所示。classStatePanelextendsJPanel{ JTextFieldtxtInfo=newJTextField(四); JTextFieldtxtHour=newJTextField(一零); IStatestate; //定義多態(tài)狀態(tài)接口 intmark=-一; publicStatePanel(){ add(newJLabel("當(dāng)前內(nèi)存狀態(tài):"));add(txtInfo); add(newJLabel("持續(xù)時(shí)間:"));add(txtHour); txtInfo.setEnabled(false); txtHour.setEnabled(false); } publicvoidsetState(intmark){ if(this.mark==mark) //內(nèi)存狀態(tài)不變 return; this.mark=mark; //內(nèi)存狀態(tài)變化,則 switch(mark){ //重置狀態(tài)對(duì)象 case一: state=newHighState();break; case二: state=newMidState();break; case三: state=newLowState();break; } } publicvoidprocess(){ txtInfo.setText(state.getStateInfo()); intsize=state.getStateInterval(); txtHour.setText(""+(float)size/三六零零); }}四.主窗口類MyFrameclassMyFrameextendsJFrameimplementsActionListener{ CtrlPanelctrlPanel=newCtrlPanel(); //參數(shù)面板 ContentPanelcontentPanel=newContentPanel(); //數(shù)值顯示面板 StatePanelstatePanel=newStatePanel(); //狀態(tài)面板 Timertimer=newTimer(一零零零,this); //定時(shí)器,間隔時(shí)間一S inthigh,mid; //高,低閾值 publicvoidinit(){ add(ctrlPanel,BorderLa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論