设计模式之状态
狀態模式介紹
狀態模式是一種行為設計模式,讓你能在一個對象的內部狀態變化時改變其行為,使其看上去就像改變了自身所屬的類一樣。
根據狀態不同,行為也不同狀態模式描述的是一個行為下的多種狀態變更,比如我們最常見的一個網站的頁面,在你登錄與不登錄時,用戶看到的頁面是不同的,而這種登錄與不登錄就是我們通過改變狀態而讓整個行為發生了變化。
狀態模式建議為對象的所有可能狀態新建一個類,然后將所有狀態的對應行為抽取到這些類中。
原始對象被稱為上下文,它并不會自行實現所有行為,而是會保存一個指向表示當前狀態對象的引用,且將所有與狀態相關的工作委派給該對象。
狀態模式結構
1、上下文
保存對于一個具體狀態對象的引用,并會將所有與該狀態相關的工作委派給它。上下文通過狀態接口與狀態對象交互,且會提供一個設置器用于傳遞新的狀態對象。
2、狀態接口
會聲明特定于狀態的方法,這些方法應能被其他所有具體狀態所理解,因為你不希望某些狀態所擁有的方法永遠不會被調用。
3、具體狀態
會自行實現特定于狀態的方法。為了避免多個狀態中包含相似代碼,你可以提供一個封裝有部分通用行為的中間抽象類。
4、業務邏輯
上下文和具體狀態都可以設置上下文的下個狀態,并可通過替代連接到上下文的狀態對象來完成實際的狀態轉換。
狀態模式的應用場景
對象需要根據自身當前狀態進行不同行為,同時狀態的數量非常多且與狀態相關的代碼會頻繁變更的話。
某個類需要根據成員變量的當前值改變自身行為,從而需要使用大量的條件語句時。
當相似狀態和基于條件的狀態機轉換中存在許多重復代碼時,可使用狀態模式。
實現方式
確定那些類是上下文,聲明狀態接口。
為每個實際狀態創建一個繼承與狀態接口的類,然后檢查上下文中的方法并將與特定狀態相關的所有代碼抽取到新建的類中。
在上下文類中添加狀態接口類型的引用成員變量。
再次檢查上下文中的方法,將空的條件語句替換為響應的狀態對象方法。
傳遞上下文狀態。
滿足單一職責原則和開閉原則。
Demo
該模式將與狀態相關的行為抽取到獨立的狀態類中,讓原對象將工作委派給這些類的實例,而不是自行進行處理。
狀態模式可通過受外部控制且能根據對象狀態改變行為的方法來識別。
抽象的狀態類
抽象的狀態類實現抽象狀態類
抽象實現類上下文類
客戶端調用
客戶端代碼輸出結果對于狀態模式來說,還是得根據具體得業務場景去實現,就是當某個狀態改變時,對應業務中有好多耦合得類也得對應做不同得變化時就可以使用狀態模式。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 ?謝謝。
往期推薦
設計模式總覽
設計模式之簡單工廠
設計模式之抽象工廠
設計模式之建造者
設計模式之原型
設計模式之單例
設計模式之適配器
設計模式之橋接
設計模式之組合
設計模式之裝飾器
設計模式之外觀
設計模式之享元
設計模式之代理
設計模式之責任鏈
設計模式之命令
設計模式之迭代器
設計模式之中介者
設計模式之備忘錄
設計模式之觀察者
總結
- 上一篇: dotnet 基于 dotnet for
- 下一篇: asp.net ajax控件工具集 Au