設計模式之狀態模式

2021-08-07 20:41:42 字數 3380 閱讀 3400

狀態模式(state pattern)當乙個物件的內在狀態改變時,允許改變其行為。這個物件看起來像是改變了其類。

狀態模式(state pattern)解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,把複雜的判斷邏輯簡化了。

案例:對乙個人一天各個時刻的工作狀態進行判斷,根據狀態改變工作行為。

1.產品設計uml類圖

(載入慢,多重新整理幾下,耐心等待……)

注:工作狀態類work和狀態抽象類state是聚合關係,state包含work,但不是work的一部分。

聚合關係:表示一種弱的"擁有"關係,體現的是a物件可以包含b物件,但b物件不是a物件的一部分。
2.狀態抽象類
package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 狀態抽象類

*/public

abstract

class

state

3.具體狀態類

設計分析:每個子類都實現乙個與工作狀態(work)的乙個狀態相關的行為,這樣做的目的是把各種狀態的轉移邏輯分布到state子類之間,來減少相互間的依賴。

在本例中,上午工作狀態、下午工作狀態、晚上工作狀態、睡覺休息狀態都繼承自state抽象類,並實現與工作狀態相關的行為(dosomework()方法)。

①上午工作狀態類

package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 上午狀態

*/public

class

amstate

extends

state else }}

②下午工作狀態類
package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 下午狀態

*/public

class

pmstate

extends

state else }}

③晚上工作狀態類
package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 晚上狀態

*/public

class

nightstate

extends

state else

if (work.gethour()<23) else

if (work.gethour()>23)}}

④停止工作狀態類
package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 結束工作狀態

*/public

class

endworkstate

extends

state else }}

⑤休息睡覺狀態類
package com.pattern.state.state;

import com.pattern.state.context.work;

/** * 睡覺休息狀態

*/public

class

sleepstate

extends

state

}

4.工作狀態類
package com.pattern.state.context;

import com.pattern.state.state.amstate;

import com.pattern.state.state.state;

/** * 工作狀態

*/public

class

work

public

double

gethour()

public

void

sethour(double hour)

public

boolean

isfinish()

public

void

setfinish(boolean finish)

public

void

dosomework()

public

void

setstate(state s)

}

5.客戶端中使用
package com

.pattern

.state

.client

;import com

.pattern

.state

.context

.work

;public class client

}

6.執行結果展示

在工作沒有做完(work.setfinish(false))的情況下:

上午9.0點鐘,努力工作中……

下午14.0點鐘,團隊開會……

18.0點鐘,加班中……

21.0點鐘,加班中……

晚上24.0點鐘,睡覺吧

在工作做完(work.setfinish(true))的情況下:

上午9.0點鐘,努力工作中……

下午14.0點鐘,團隊開會……

18.0點鐘,加班中……

21.0點鐘,工作完成了,終於下班了

晚上24.0點鐘,睡覺吧

當乙個物件的行為取決於它的狀態,並且需要在執行中根據狀態改變它的行為的時候,就可以考慮使用狀態模式了,狀態模式是條件分支語句的代替者。

1.狀態模式的優點

2.狀態模式的缺點

設計模式之狀態模式

一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...

設計模式之 狀態模式

gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...

設計模式之狀態模式

定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...