注重這種模式的理解!!!
我們在寫程式的過程中會遇到很多的邏輯判斷,一般都是用if ..else、if..else if、swith(..) case等來做判斷,然後根據結果做一下分支處理,這樣寫雖然方便,但會增加以後的維護難度,假如有上百個if ..else if判斷,估計後期維護的人看到**頭都大了。像這種情況可以用state模式來解決。
state模式是行為模式之一。當某個物件的內部狀態(通俗的說,成員變數)發生改變,它的行為也會發生改變。
狀態模式的角色:
抽象狀態、具體狀態(一種或多個狀態,每種狀態對應不同的行力),環境(context)角色(就是物件,包括當前物件狀態、改變狀態的方法和狀態行為方法)
為了幫助理解,舉例說明:
乙個畫圖程式,有乙個控制面板,上面羅列了各種畫圖工具以及其它顏色選擇,滴管等工具,當使用者選擇或改變了畫圖工具時,就可以使用各種不同的工具進行畫圖或其他操作了。
我們把這個過程用另外一種方法再描述一下:
- 使用者選擇畫圖工具就是乙個畫筆狀態的改變。
- 每個工具能畫的圖形可能完全不一樣,也就是說它們的行為各不一樣。
- 改變了畫圖工具,在畫布上畫出的圖形當然也不一樣了,換句話說,畫筆狀態的改變導致行為的不一樣。
再舉個例子,100公尺短跑遠動員。他有三種狀態,生病狀態,正常狀態,興奮狀態。那麼狀態決定這個運動員的行為,生病狀態跑的速度慢,興奮狀態跑的速度快。我們以運動員程式為例,如果不用設計模式的話,我們可能會這寫
package com.bill99.pattern;
/***title: 一般運動員
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class gamer
public void run() else if(state == malum_state) else if(state == excited_state) else
}}
如果以後維護的話,要再加乙個超級興奮的狀態,得要改原來的源**,新增乙個代表超級興奮的成員變數,再改if..else if判斷,這樣做不符合oo設計原則,實現不了程式的松耦合。
下面用狀態模式來實現
package com.bill99.pattern.state;
/***title:狀態介面
*description:狀態介面,每乙個狀態都要實現此介面
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public inte***ce istate
package com.bill99.pattern.state;
/***title: 興奮狀態運動員
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class excitedstate implements istate
}
package com.bill99.pattern.state;
/***title:生病狀態運動員
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class malumstate implements istate
}
package com.bill99.pattern.state;
/***title:正常狀態運動員
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class normalstate implements istate
}
構建乙個場景,運動員類,該運動員類包括表示當前物件狀態的成員變數,改變當前狀態的方法,和狀態行為方法
package com.bill99.pattern.state;
/***title: 採用狀態模式的運動員
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class gamer
//狀態行為方法,同上面的gamer 類相比這裡沒有if..else if判斷
public void run()
}
測試類
package com.bill99.pattern.state;
/***title: 測試類
*description:
*company: 99bill.com
*create date: 2009-11-3
*@author zhang weiyang */
public class statetest
}
執行結果:
100公尺,跑完共用時15秒!
100公尺,跑完共用時20秒!
100公尺,跑完共用時10秒!
———————
100公尺,跑完共用時15秒!
100公尺,跑完共用時20秒!
100公尺,跑完共用時10鈔!
假如我們再擴充套件乙個超級興奮的狀態superexcitedstate,只需實現istate介面,定義好該狀態的行為,呼叫如下
gamer.setstate(new superexcitedstate());
gamer.run();
而不用改原有**,提高程式的松耦合。
用State模式建立嚮導的實踐。。。
嚮導就是類似於安裝軟體時,一大堆下一步的那個窗體。每乙個上一步下一步意味著窗體上的控制項需要改變,相關的按鈕的功能等也需要改變。在製作乙個嚮導時,最初設計中,我用的enum來表示每乙個步驟。比如 switch stepenum public abstract class initwizardstep...
狀態 State 模式
物件狀態影響物件行為 物件擁有不同的狀態,往往會行使不同的行為.1 動機 在軟體構建過程中,某些物件的狀態如果改變,其行為也會隨之而發生變化。比如文件處於唯讀狀態,其支援的行為和讀寫狀態支援的行為就可能完全不同。如何在執行時根據物件的狀態來透明地更改物件的行為?而不會為物件操作和狀態轉化之前引入緊耦...
狀態模式 State
個人理解 核心是context維護乙個當前狀態,並在invoke狀態方法時,將context維護的當前狀態更新至下一狀態 uml類圖 實現 using system namespace decoratormode public class agecontext public void printag...