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