定義
狀態(tài)模式允許對(duì)象內(nèi)部
狀態(tài)改變時(shí)改變他的行為,對(duì)象看起來好像修改了他的類.
要點(diǎn)
- Context會(huì)將行為委托給當(dāng)前的狀態(tài)對(duì)象.
- 狀態(tài)模式和策略模式擁有相同的類圖,但是他們的意圖不同.
- 狀態(tài)的切換可以由Context類或者狀態(tài)類來切換
個(gè)人理解
狀態(tài)模式和策略模式很像,但他們又有許多不同之處.策略模式會(huì)在外部控制對(duì)象使用組合或者委托來使對(duì)象在運(yùn)行時(shí)執(zhí)行不同的行為.而狀態(tài)模式更像是將這些行為和狀態(tài)的改變封裝在內(nèi)部,我們外部只是需要做一些小小的動(dòng)作,其余狀態(tài)的改變都是在對(duì)象內(nèi)部
自動(dòng)完成的!狀態(tài)模式同時(shí)更方便我們來擴(kuò)展代碼,避免了代碼中大量出現(xiàn)switch
語句卻不好維護(hù)的尷尬.
針對(duì)狀態(tài)模式的實(shí)現(xiàn),書中給出了兩種實(shí)現(xiàn)方案,我們先來闡述下實(shí)現(xiàn)以及特點(diǎn).
第一種:將狀態(tài)的切換交給對(duì)象的各個(gè)狀態(tài)類.這是書中主要在講的一種方式,先是通過構(gòu)造方法將Context的對(duì)象傳入到狀態(tài)類中,這種寫法在Context中寫一些get
方法,獲取到對(duì)象的各個(gè)狀態(tài)類,這是為了一定程度上的解耦,但依然可以看出,我們將改變狀態(tài)的時(shí)機(jī)交給狀態(tài)類的話,未免耦合還是有一些高.然后當(dāng)Context需要委托執(zhí)行動(dòng)作時(shí),只要執(zhí)行當(dāng)前狀態(tài)下的委托便可以了.
第二種:將狀態(tài)的切換留在Context中.我們需要對(duì)Context這個(gè)類的狀態(tài)切換做更多的操作,但寫法如何能更加優(yōu)雅是一個(gè)很值得深思的問題.