版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第一三章狀態(tài)模式一三.一問題地提出一三.二狀態(tài)模式一三.三深入理解狀態(tài)模式一三.四應(yīng)用示例一二.一問題地提出總之,研究各種狀態(tài)以及狀態(tài)間相互轉(zhuǎn)化地實現(xiàn)方式是本章研究地關(guān)鍵問題,狀態(tài)模式為我們提出了一種較好地設(shè)計思路。一二.二狀態(tài)模式Context-state:State+manage():void<<interface>>State+goState():voidConcreteStateA+goState():voidConcreteStateB+goState():void一類圖二類圖說明?State:狀態(tài)接口,封裝特定狀態(tài)所對應(yīng)地行為。?ConcreteState:具體實現(xiàn)狀態(tài)處理地類。?Context:事物類,也稱上下文類,通常用來定義多態(tài)狀態(tài)接口,同時維護一個來具體處理當(dāng)前狀態(tài)地實例對象。一三.三深入理解狀態(tài)模式一.利用上下文類控制狀態(tài)考慮手機應(yīng)用。假設(shè)手機功能有存款,電話功能。有三種狀態(tài),正常,透支,停機三種狀態(tài),適用狀態(tài)模式加以仿真描述。(一)定義手機狀態(tài)接口ICellStateinterfaceICellState{ publicfloatNORMAL_LIMIT=零; publicfloatSTOP_LIMIT=-一; publicfloatCOST_MINUTE=零.二零f; publicbooleanphone(CellContextct);}當(dāng)手機余額>NORMAL_LIMIT,手機處于正常狀態(tài),當(dāng)余額<STOPL_LIMIT,手機處于停機狀態(tài),當(dāng)NORMAL_LIMIT余額STOP_LIMIT,手機處于透支狀態(tài)。(二).定義手機用戶三種狀態(tài)類//正常狀態(tài)下打電話類classNormalStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":手機處于正常狀態(tài)"); intminute=(int)(Math.random()*一零+一);//隨機產(chǎn)生打電話分鐘數(shù) ct.cost(minute); //計算花費錢數(shù) //保存信息到數(shù)據(jù)庫 returnfalse; } }//透支狀態(tài)下打電話類classOverDrawStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于欠費狀態(tài),請及時繳費"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); //保存信息到數(shù)據(jù)庫 returnfalse; } }//停機類classStopStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于停機狀態(tài),請及時繳費"); //保存信息到數(shù)據(jù)庫 returnfalse; } }(三)手機上下文狀態(tài)類CellContextclassCellContext{ StringstrPhone; //電話號碼 Stringname; //姓名 floatprice; //金額 publicCellContext(StringstrPhone,Stringname,floatprice){ this.strPhone=strPhone;=name;this.price=price; } publicvoidsave(floatprice){//手機存錢 this.price+=price; } publicvoidcost(intminute){//手機打了n分鐘,重新計算余額 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; }}(四)一個簡單地測試類publicclassTest{ publicstaticvoidmain(String[]args){ CellContextc=newCellContext("一三八零九零八九二五","jin",一);//新建手機用戶,余額一元 c.phone();c.phone();//打兩次電話 c.save(四); //又存入四元錢 c.phone();c.phone();c.phone();c.phone();//又打四次電話 }}二.利用具體狀態(tài)類控制狀態(tài)仍以手機應(yīng)用為例,具體代碼如下所示。(一)定義手機狀態(tài)接口ICellStateinterfaceICellState{/*同一三.三-一*/}(二).定義手機用戶三種狀態(tài)類//正常狀態(tài)下打電話類classNormalStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":手機處于正常狀態(tài)"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設(shè)置打電話后地狀態(tài) //保存信息到數(shù)據(jù)庫 returnfalse; } }//透支狀態(tài)下打電話類classOverDrawStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于欠費狀態(tài),請及時繳費"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設(shè)置打電話后地狀態(tài) //保存信息到數(shù)據(jù)庫 returnfalse; } }//停機類classStopStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于停機狀態(tài),請及時繳費"); //保存信息到數(shù)據(jù)庫 returnfalse; } }(三)手機上下文狀態(tài)類CellContextclassCellContext二{ publicfinalintNORMAL_STATE=一; publicfinalintOVERDRAW_STATE=二; publicfinalintSTOP_STATE=三; StringstrPhone; Stringname; floatprice; intmark=NORMAL_STATE;//初始化默認手機處于正常態(tài) ICellState state; //多態(tài)手機狀態(tài)對象 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)用示例例一三-一計算機內(nèi)存監(jiān)控程序。設(shè)計算機物理總內(nèi)存為total,空閑內(nèi)存為free,則有公式,表示內(nèi)存空閑率。設(shè)兩個閾值為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("開始監(jiān)測"),newJButton("停止監(jiān)測")}; booleanbmark[][]={{true,true,true,false}, {false,false,false,true}}; ActionListenerstartAct=newActionListener(){ //"開始監(jiān)測"按鈕響應(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);//通知父窗口,開始監(jiān)測 } }; ActionListenerstopAct=newActionListener(){ //"停止監(jiān)測"按鈕響應(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)測 } }; publicCtrlPanel(){ add(newJLabel("優(yōu)良")); add(c[零]); add(newJLabel("良好")); add(c[一]); add(c[二]); add(c[三]); setState(零);//為組件設(shè)置初始狀態(tài)
((JButton)c[二]).addActionListener(startAct);//"開始監(jiān)測"按鈕注冊 ((JButton)c[三]).addActionListener(stopAct);//"停止監(jiān)測"按鈕注冊 } 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();}②三個具體狀態(tài)實現(xiàn)類classHighStateimplementsIState{//內(nèi)存充裕狀態(tài) privateinttimes; //監(jiān)測次數(shù) publicStringgetStateInfo(){ return"充裕"; } publicintgetStateInterval(){ returntimes++; } }classMidStateimplementsIState{ //內(nèi)存良好狀態(tài) privateinttimes; //監(jiān)測次數(shù) publicStringgetStateInfo(){ return"良好"; } publicintgetStateInterval(){ returntimes++; } }classLowStateimplementsIState{ //內(nèi)存緊張狀態(tài) privateinttimes; //監(jiān)測次數(shù) publicStringgetStateInfo(){ return"一般"; } publicintgetStateInterval(){ returntimes++; } }③定義狀態(tài)上下文類StatePanel它也即是狀態(tài)面板類,與狀態(tài)上下文類是同一個類。如下所示。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ù)時間:"));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)對象 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); //定時器,間隔時間一S inthigh,mid; //高,低閾值 publicvoidinit(){ add(ctrlPanel,BorderLa
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年廣東舞蹈戲劇職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細解析
- 2026甘肅蘭州新區(qū)招聘幼兒教師38人考試重點試題及答案解析
- 2025年山東省濟寧市中考歷史真題
- 感動中國2021年年度人物王鋒頒獎詞和事跡材料(觀后感)
- 園藝職業(yè)發(fā)展規(guī)劃指南
- 課程編輯成長手冊
- 2026秋招:五得利面粉集團面試題及答案
- 牙科牙周治療合同(2025年牙齒護理)
- 健身場館合作協(xié)議(2025年私教服務(wù)推廣)
- 法律咨詢2025年合同協(xié)議
- 山西省金科新未來2024-2025學(xué)年高一上學(xué)期期末考試化學(xué)試題(含答案)
- 電氣檢測安全報告
- 第四屆全國儀器儀表行業(yè)職業(yè)技能競賽-無人機裝調(diào)檢修工(儀器儀表檢測)理論考試題庫(含答案)
- 國家職業(yè)技術(shù)技能標(biāo)準 4-10-01-05 養(yǎng)老護理員 人社廳發(fā)201992號
- 急性梗阻性化膿性膽管炎護理
- 2024深海礦產(chǎn)資源開采系統(tǒng)技術(shù)指南
- 2022通達經(jīng)營性物業(yè)貸調(diào)查報告
- 立式氣液分離器計算
- 財務(wù)每日工作匯報表格
- 2022-2023學(xué)年廣東省佛山市南海區(qū)、三水區(qū)九年級(上)期末數(shù)學(xué)試卷含解析
- 版權(quán)登記代理委托書
評論
0/150
提交評論