用State模式減少if elseif語句

2021-06-21 23:11:47 字數 3148 閱讀 9782

注重這種模式的理解!!!

我們在寫程式的過程中會遇到很多的邏輯判斷,一般都是用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...