STATE(狀態)模式

2021-07-14 23:03:50 字數 2535 閱讀 4492

在我們軟體開發的過程中,有許多物件是有狀態的。而物件的行為會隨著狀態的改變而發生改變。例如開發乙個電梯類,電梯有開門、關門、停止、執行等行為,同時電梯也會有開門狀態、關門狀態、停止狀態、執行狀態等不同的狀態。電梯處於不同的狀態時,對不同的行為會做出不同的動作。如當電梯處於開門狀態時,電梯可以做關門動作;開門狀態時,電梯一定是停止的,所以此時停止動作不會發生任何行為;開門狀態時,電梯不能執行,所以執行動作也不會發生任何行為。如果我們使用條件判斷語句實現上述邏輯,會出現大量的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 ...