在我們軟體開發的過程中,有許多物件是有狀態的。而物件的行為會隨著狀態的改變而發生改變。例如開發乙個電梯類,電梯有開門、關門、停止、執行等行為,同時電梯也會有開門狀態、關門狀態、停止狀態、執行狀態等不同的狀態。電梯處於不同的狀態時,對不同的行為會做出不同的動作。如當電梯處於開門狀態時,電梯可以做關門動作;開門狀態時,電梯一定是停止的,所以此時停止動作不會發生任何行為;開門狀態時,電梯不能執行,所以執行動作也不會發生任何行為。如果我們使用條件判斷語句實現上述邏輯,會出現大量的if else判斷,或者switch case 語句。而且當需要增加乙個狀態時,這些條件判斷語句都需要修改。例如增加乙個維修狀態,不僅會修改原有的if else,還有引入維修狀態的判斷和執行邏輯。
為了解決上面說的不同狀態不同行為的問題,引出了狀態模式。乙個物件在某一時刻只有一種狀態,根據物件的狀態決定物件的某乙個行為的具體動作。
允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。
電梯類:
/**
* 環境類:定義客戶感興趣的介面。維護乙個concretestate子類的例項,這個例項定義當前狀態。
*/public
class
lift
public
boolean
close()
public
boolean
run()
public
boolean
stop()
public liftstate getliftstate()
public
void
setliftstate(liftstate liftstate)
}
狀態介面:
/**
* * 定義乙個電梯的狀態介面
*/public
abstract
class
liftstate
具體狀態類:
open狀態類:
/**
* 在電梯門開啟的狀態下能做什麼事情
*/public
class
openingstate
extends
liftstate
/**
* 開啟當然可以關閉了,我就想測試一下電梯門開關功能
*/@override
boolean close(lift lift)
@override
boolean run(lift lift)
@override
boolean stop(lift lift)
@override
liftstate getstate()
}
close狀態類:
public
class
closingstate
extends
liftstate
@override
boolean close(lift lift)
@override
boolean run(lift lift)
@override
boolean stop(lift lift)
@override
liftstate getstate()
}
stop狀態類:
public
class
stoppingstate
extends
liftstate
@override
boolean close(lift lift)
@override
boolean run(lift lift)
@override
boolean stop(lift lift)
@override
liftstate getstate()
}
run狀態類:
public
class
runningstate
extends
liftstate
@override
boolean close(lift lift)
@override
boolean run(lift lift)
@override
boolean stop(lift lift)
@override
liftstate getstate()
}
測試類:
public
class client
}
參考:
《設計模式可復用物件導向軟體的基礎》
狀態 State 模式
物件狀態影響物件行為 物件擁有不同的狀態,往往會行使不同的行為.1 動機 在軟體構建過程中,某些物件的狀態如果改變,其行為也會隨之而發生變化。比如文件處於唯讀狀態,其支援的行為和讀寫狀態支援的行為就可能完全不同。如何在執行時根據物件的狀態來透明地更改物件的行為?而不會為物件操作和狀態轉化之前引入緊耦...
狀態模式 State
個人理解 核心是context維護乙個當前狀態,並在invoke狀態方法時,將context維護的當前狀態更新至下一狀態 uml類圖 實現 using system namespace decoratormode public class agecontext public void printag...
state 狀態模式
include include using namespace std 1 將 state宣告為 context的友元類 friend class 其作用是讓 state模式訪問 context 的 protected介面 changesate 2 state 及其子類中的操作都將 context ...