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