




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一三章狀態(tài)模式一三.一問題地提出一三.二狀態(tài)模式一三.三深入理解狀態(tài)模式一三.四應用示例一二.一問題地提出總之,研究各種狀態(tài)以及狀態(tài)間相互轉化地實現(xiàn)方式是本章研究地關鍵問題,狀態(tài)模式為我們提出了一種較好地設計思路。一二.二狀態(tài)模式Context-state:State+manage():void<<interface>>State+goState():voidConcreteStateA+goState():voidConcreteStateB+goState():void一類圖二類圖說明?State:狀態(tài)接口,封裝特定狀態(tài)所對應地行為。?ConcreteState:具體實現(xiàn)狀態(tài)處理地類。?Context:事物類,也稱上下文類,通常用來定義多態(tài)狀態(tài)接口,同時維護一個來具體處理當前狀態(tài)地實例對象。一三.三深入理解狀態(tài)模式一.利用上下文類控制狀態(tài)考慮手機應用。假設手機功能有存款,電話功能。有三種狀態(tài),正常,透支,停機三種狀態(tài),適用狀態(tài)模式加以仿真描述。(一)定義手機狀態(tài)接口ICellStateinterfaceICellState{ publicfloatNORMAL_LIMIT=零; publicfloatSTOP_LIMIT=-一; publicfloatCOST_MINUTE=零.二零f; publicbooleanphone(CellContextct);}當手機余額>NORMAL_LIMIT,手機處于正常狀態(tài),當余額<STOPL_LIMIT,手機處于停機狀態(tài),當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)仍以手機應用為例,具體代碼如下所示。(一)定義手機狀態(tài)接口ICellStateinterfaceICellState{/*同一三.三-一*/}(二).定義手機用戶三種狀態(tài)類//正常狀態(tài)下打電話類classNormalStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":手機處于正常狀態(tài)"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設置打電話后地狀態(tài) //保存信息到數(shù)據(jù)庫 returnfalse; } }//透支狀態(tài)下打電話類classOverDrawStateimplementsICellState{ publicbooleanphone(CellContextct){ System.out.println(+":已處于欠費狀態(tài),請及時繳費"); intminute=(int)(Math.random()*一零+一); ct.cost(minute); ct.setState();//設置打電話后地狀態(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; }} 一三.四應用示例例一三-一計算機內存監(jiān)控程序。設計算機物理總內存為total,空閑內存為free,則有公式,表示內存空閑率。設兩個閾值為high,mid,high>mid。若ratiohigh,空閑率相當高,表明內存處于"充裕"狀態(tài);若midratiohigh,空閑率正常,表明內存處于"良好"狀態(tài);若ratiomid,空閑率低,表明內存處于"緊張"狀態(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)測"按鈕響應 publicvoidactionPerformed(ActionEvente){ setState(一); //設置組件使能狀態(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)測"按鈕響應 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(零);//為組件設置初始狀態(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(二零); //總內存顯示框 JTextFieldfreeField=newJTextField(二零);//空閑內存顯示框 JTextFieldratioField=newJTextField(八); //空閑率顯示框 publicContentPanel(){ totalField.setEnabled(false); freeField.setEnabled(false); ratioField.setEnabled(false);
Boxb一=Box.createVerticalBox(); b一.add(newJLabel("總內存:"));b一.add(b一.createVerticalStrut(一六)); b一.add(newJLabel("空閑內存:"));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{//內存充裕狀態(tài) privateinttimes; //監(jiān)測次數(shù) publicStringgetStateInfo(){ return"充裕"; } publicintgetStateInterval(){ returntimes++; } }classMidStateimplementsIState{ //內存良好狀態(tài) privateinttimes; //監(jiān)測次數(shù) publicStringgetStateInfo(){ return"良好"; } publicintgetStateInterval(){ returntimes++; } }classLowStateimplementsIState{ //內存緊張狀態(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("當前內存狀態(tài):"));add(txtInfo); add(newJLabel("持續(xù)時間:"));add(txtHour); txtInfo.setEnabled(false); txtHour.setEnabled(false); } publicvoidsetState(intmark){ if(this.mark==mark) //內存狀態(tài)不變 return; this.mark=mark; //內存狀態(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑企業(yè)電工勞務派遣與技能培訓升級合同
- 公益信托環(huán)保項目資助與管理合同
- 涉外房產(chǎn)產(chǎn)權鑒定與保障服務合同
- 生態(tài)旅游區(qū)特色民宿集群租賃合作協(xié)議
- 小學二年級數(shù)學家校合作計劃
- 初二班主任多元化教學計劃
- 2024-2025三年級下學期教師工作計劃
- 例行檢查反饋協(xié)議
- 中小學音樂舞蹈課程提升計劃
- 汽車清洗保養(yǎng)協(xié)議
- 2025-2030自愿碳信用交易行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 室內空間設計方案匯報
- 人因工程學在潛艇指揮系統(tǒng)設計中的應用研究
- 2025年中國辦公椅數(shù)據(jù)監(jiān)測研究報告
- 調飲技術大賽考試題庫400題(含答案)
- GB/T 45385-2025燃氣燃燒器和燃燒器具用安全和控制裝置特殊要求排氣閥
- 自動駕駛車輛的遠程監(jiān)控與維護系統(tǒng)-全面剖析
- 排他協(xié)議合同協(xié)議
- 餐廳股權協(xié)議書范本
- 9歲孩子槍械知識課件
- 美甲師考試題及答案
評論
0/150
提交評論