設計模式之狀態模式

2021-10-17 01:39:55 字數 2783 閱讀 7975

狀態模式是一種行為設計模式, 讓你能在乙個物件的內部狀態變化時改變其行為, 使其看上去就像改變了自身所屬的類一樣。

①假如你有乙個文件document類。 文件可能會處於草稿draft 、 ​審閱中moderation和已發布published三種狀態中的一種。 文件的publish發布方法在不同狀態下的行為略有不同:

此時,每乙個狀態都是乙個實現了基類的狀態類,狀態模式通過判斷,決定當物件處於某個狀態時,將物件的status物件切換為不同的狀態物件。來實現狀態的切換或者不切換

②假設處理乙個需求時,需要根據物件變數的狀態或者改變值,根據不同的條件分支,執行不同的程式時。例如,需要根據使用者提交資料的時間,來決定執行什麼方法時

正常處理可能會通過四個分支判斷,來決定執行什麼方法。但是這種方式雖然能夠實現,但是如果需求有了變更,需要修改分支判斷的某個分支,或者對整個分支進行修改。而且分支條件如果很多的話,容日導致混亂和冗餘。則此時可以通過狀態模式,來完成分支判斷。

在狀態模式中,將不再使用複雜的分支判斷來實現。而是通過將每一種判斷,都封裝成乙個判斷類,然後通過乙個狀態物件,通過傳遞的方式,完成判斷實現

①所有判斷類的基類介面:用於提供所有判斷類的父介面,可以方便的在狀態類中,利用多型來實現物件的傳遞

③狀態類:狀態類是整個狀態模式中的核心類,也就是需要對某個物件的某個屬性判斷時,這個物件,就是狀態類

例子:

通過判斷工作的時間點,來決定執行這個人處於什麼狀態。(多條件分支判斷)

①需要進行判斷的物件。狀態類

public class work 

//該物件通過執行這個方法,完成對工作時間處於什麼狀態的判斷,實際呼叫的是判斷類的方法

public string handle()

}

②所有判斷類的介面

public inte***ce status
③所有的判斷類

上午狀態判斷類

public class forenoonstatus implements status else }}

中午狀態判斷類

public class noonstatus implements statuselse }}

下午茶判斷類

public class teastatus implements status else }}

下午判斷類

public class afternoonstatus implements statuselse }}

晚上判斷類

public class eveningstatus implements status else else }}

}

睡覺類

public class sleepstatus implements status else }}

④測試類

該例子的業務場景是:

通過遙控器的按鍵,讓電視完成響應的響應。當電視當前處於不同狀態是,電視做出的響應也是不同的。例如:

這個例子就涉及到了,當物件處於不同的狀態時,相同行為做的反應是不同的。而且。狀態屬性會根據實際的需求,發生變化。

該**示例拆解:

①將行為抽象為多個方法到父類status中:onlock、inplay、onnext等。

②物件的不同狀態,定義為多個不同的狀態類。並且實現這些行為。不同狀態的這些行為方法,有自己的實現邏輯(可能需要改變狀態)。

③此時,player類,就是我們要操作的物件。其中定義了status父類行的變數,初始化了該物件的預設狀態為ready狀態。

則,對player例項化物件,執行onlock方法時,會根據當前player例項的狀態status類,來決定,onlock方法執行什麼邏輯。同理。其他的方法也是。

從而實現了,根據狀態決定行為,並且可能還會改變物件的狀態的狀態模式實現。

如果上文中的例子,不通過設計模式:

例如onlock方法的執行:

if(player.status='待機')

執行:將player的狀態設定為:'關機'

if(player.status='關機')

執行:無需操作

通過設計模式後:

不需要通過if/else進行分支判斷了。

並且將所有的判斷定義成了子類。並且每個子類都有不同的執行邏輯,並且按照需要可以將player的狀態進行修改。

此模式,與三:demo中的例子並不衝突。

在demo例子中,也是不同時間,有不同的執行邏輯。每乙個子類。都是一種狀態。可以通過setstatus()的方式,修改work物件的狀態。如果要顯示的增加狀態,可以在每個子類中,定義乙個屬性,當前類的status欄位。並通過work.status.getstatus獲取到work物件的狀態值。

設計模式之狀態模式

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

設計模式之 狀態模式

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

設計模式之狀態模式

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