狀態模式 State Pattern

2021-08-04 15:53:54 字數 2059 閱讀 8534

細想狀態變更的實質就是乙個狀態與狀態二維的關係表。電梯例子,通過狀態的變化形成二維的**,電梯門關閉、電梯門開啟、電梯上下運載、電梯停止。

如果通過乙個個遍歷狀態通過if  esle 完成**不利於**維護。

//電梯門關了再開啟,逗你玩呢,那這個允許呀

@override

public void open()

//電梯門關了就跑,這是再正常不過了

@override

public void run()

//電梯門關著,我就不按樓層

@override

public void stop()

}

public class runningstate extends liftstate  

//執行的時候開電梯門?你瘋了!電梯不會給你開的

@override

public void open()

//這是在執行狀態下要實現的方法

@override

public void run()

//這個事絕對是合理的,光執行不停止還有誰敢做這個電梯?!估計只有上帝了

@override

public void stop()

}

public class stoppingstate extends liftstate 

@override

public void open()

@override

public void run()

@override

public void stop()

}

public class client  

}

優點:首先是避免了過多的 swith…case或者if..else語句的使用,避免了程式的複雜性;

其次是很好的使用體現了開閉原則和單一職責原則,每個狀態都是乙個子類,增加狀態就增加子類,你要修改狀態,你只修改乙個子類就可以了;

最後乙個好處就是封裝性非常好,這也是狀態模式的基本要求,狀態變換放置到了類的內部來實現,外部的呼叫不用知道類內部如何實現狀態和行為的變換。 

缺點:子類會太多,也就是類膨脹。

工作流中 activity(節點)有初始化狀態(initialized state)、掛起狀態(suspended state)、完成狀態(completed state)等等,流程例項這麼多狀態,狀態怎麼管理呢?通過狀態機(state machine)來管理, 狀態機就是 context類的擴充套件版! 

變化多端的狀態模式 State Pattern

現在寫字樓越建越高,碼農上個班不但要擠個地鐵,還要擠個電梯。電梯的執行簡單有這麼幾個狀態 執行 停止 關閉 開啟,電梯想要正常的執行,就必須得遵循一定的規則,例如執行的時候不能開門,開門狀態不能執行。按照平常的邏輯,分別建立open,close,run,stop四個方法,方法裡通過switch當前的...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...