State(状态)--对象行为型模式
State(狀態)–對象行為型模式
一、意圖
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
二、動機
1.在軟件構建過程中,某些對象的狀態如果改變,其行為也會隨之而發生變化,比如文檔處于只讀狀態,其支持的行為和讀寫狀態支持的行為就可能完全不同。
2.如何在運行時根據對象的狀態來透明地更改對象的行為?而不會為對象操作和狀態轉化之間引入緊耦合?
三、適用性
1.一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為。
2.一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,者一對象可以不依賴于其他對象而獨立的變化。
四、結構
五、效果
1.它將于特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。 State模式將所有于一個特定的狀態相關的行為都放入一個對象中。因為所有于狀態相關的代碼都存在于某一個State子類中,所以通過定義新的子類可以很容易的增加新的狀態和轉換。
2.它使得狀態轉化顯式化。 當一個對象僅以內部數據值來定義當前狀態時,其狀態僅表現為對一些變量的賦值,這不夠明確。為不同的狀態引入獨立的對象使得轉換變得更加明確。而且,State對象可保證Context不會發生內部狀態不一致的情況,因為從Context的角度看,狀態轉換是原子的——只需要重新綁定一個變量(即Context的State對象變量),而無需為對個變量賦值。
3.State對象可被共享。 如果State對象沒有實例變量——即他們表示的狀態完全以他們的類型來編碼——那么各Context對象可以共享一個State對象。當狀態以這種方式被共享時,他們必然沒有內部狀態,只有行為的輕量級對象。
六、實現
1.誰定義狀態轉換。 State模式不指定哪個一參與者定義狀態轉換準則。如果該準則是固定的,那么他們可在Context中完全實現。然而若讓State子類自身指定他們的后繼狀態以及何時進行轉換,通常更靈活更合適,這需要Context增加一個接口,讓State對象顯示地設定Context的當前狀態。
用這種方法分散轉換邏輯可言很容易地定義新的State子類來修改和擴展該邏輯。這樣做的一個缺點是,一個State子類至少擁有一個其他子類信息,這就在個子類之間產生了實現依賴。
2.基于表的另一種方式。
3.創建和銷毀State對象。 一個常見的值得考慮的實現上的權衡是,究竟是(1)僅需要State對象是才創建他們并隨后銷毀他們,還是(2)提前創建他們并且始終不銷毀他們。
4.使用動態繼承。
七、要點總結
1.State模式將所有于一個特定狀態相關的行為都放入一個State的子類對象中,在對象狀態切換時,切換相應的對象;但同時維持State的接口,這樣實現了具體操作于狀態轉換之間的解耦。
2.為不同的狀態引入不同的對象使得狀態轉換變得更加明確,而且可以保證不會出現狀態不一致的情況,因為轉換時原子性的——即要么徹底轉換過來,要么不轉換。
3.如果State對象沒有實例變量,那么各個上下文可以共享一個State對象,從而節省對象開銷。
八、相關模式
Flyweight模式解釋了何時以及怎樣共享狀態對象。
狀態對象通常是Singleton。
九、舉例說明
人醉酒時的狀態和平時的狀態。
本文為李建忠設計模式視頻的筆記以及《設計模式-可復用面向對象的軟件的基礎》和自己的部分見解
總結
以上是生活随笔為你收集整理的State(状态)--对象行为型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样加入滳滳专车
- 下一篇: Strategy(策略)--对象行为型模