狀態模式(state pattern)當乙個物件的內在狀態改變時,允許改變其行為。這個物件看起來像是改變了其類。狀態模式(state pattern)解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,把複雜的判斷邏輯簡化了。
案例:對乙個人一天各個時刻的工作狀態進行判斷,根據狀態改變工作行為。
1.產品設計uml類圖
(載入慢,多重新整理幾下,耐心等待……)
注:工作狀態類work
和狀態抽象類state
是聚合關係,state
包含work
,但不是work
的一部分。
聚合關係:表示一種弱的"擁有"關係,體現的是a物件可以包含b物件,但b物件不是a物件的一部分。
2.狀態抽象類3.具體狀態類package com.pattern.state.state;
import com.pattern.state.context.work;
/** * 狀態抽象類
*/public
abstract
class
state
設計分析:每個子類都實現乙個與工作狀態(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 }}
4.工作狀態類package com.pattern.state.state;
import com.pattern.state.context.work;
/** * 睡覺休息狀態
*/public
class
sleepstate
extends
state
}
5.客戶端中使用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)
}
6.執行結果展示package com
.pattern
.state
.client
;import com
.pattern
.state
.context
.work
;public class client
}
在工作沒有做完(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的乙個特...