摘要:在狀態(tài)模式中,我們創(chuàng)建表示各種狀態(tài)的對象和一個行為隨著狀態(tài)對象改變而改變的對象。缺點(diǎn)狀態(tài)模式的使用必然會增加系統(tǒng)類和對象的個數(shù)。狀態(tài)模式是指允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類。
狀態(tài)模式
在狀態(tài)模式(State Pattern)中,類的行為是基于它的狀態(tài)改變的。這種類型的設(shè)計模式屬于行為型模式。意圖主要解決
在狀態(tài)模式中,我們創(chuàng)建表示各種狀態(tài)的對象和一個行為隨著狀態(tài)對象改變而改變的 context 對象。
允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變它的行為,對象看起來好像修改了它的類優(yōu)點(diǎn)
對象的行為依賴于它的狀態(tài)(屬性),并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為。
封裝了轉(zhuǎn)換規(guī)則。
枚舉可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀態(tài)種類。
將所有與某個狀態(tài)有關(guān)的行為放到一個類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為。
允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體,而不是某一個巨大的條件語句塊。
可以讓多個環(huán)境對象共享一個狀態(tài)對象,從而減少系統(tǒng)中對象的個數(shù)。
缺點(diǎn)狀態(tài)模式的使用必然會增加系統(tǒng)類和對象的個數(shù)。
狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。
狀態(tài)模式對"開閉原則"的支持并不太好,對于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無法切換到新增狀態(tài),而且修改某個狀態(tài)類的行為也需修改對應(yīng)類的源代碼。
狀態(tài)模式實現(xiàn)class Menu
我們使用es6實現(xiàn)一個類的創(chuàng)建, 便于我們多個地方重復(fù)使用,其實狀態(tài)模式是要根據(jù)你的狀態(tài)
來實現(xiàn)或者操作你想要的東西
class Menu{ }
狀態(tài)對象
創(chuàng)建一個狀態(tài)對象或者數(shù)組,內(nèi)部保存狀態(tài)變量,然后內(nèi)部封裝好每種動作對應(yīng)的狀態(tài),然后狀態(tài)對象返回一個接口對象,它可以對內(nèi)部的狀態(tài)修改或者調(diào)用。
this.menuStates = { hide:function () { console.log("hide") }, show: function () { console.log("show") }, left: function () { console.log("left") }, right: function () { console.log("right") } }
上面就是我們的狀態(tài)對象,一共有四個狀態(tài)函數(shù),做出不同的操作和實現(xiàn)
具體的使用函數(shù)
觸發(fā)我們要執(zhí)行的狀態(tài),state是我要傳遞callback函數(shù)參數(shù),我們會根據(jù)傳遞的函數(shù)進(jìn)行調(diào)用執(zhí)行它,當(dāng)然在執(zhí)行過程當(dāng)中
我們還可以設(shè)定使用其它的抽象類,以達(dá)到我們想要的單一原則,不要在乎是不是這樣寫比以前那樣代碼還多了,
確實會多,但是復(fù)用的時候你再看看是否還會再那么的繁瑣以及更多的代碼編寫
toggle (state) { state() }代碼組合實現(xiàn)
Title class Menu { constructor(state){ this.num = 1 this.menuStates = { hide:function () { console.log("hide") }, show: function () { console.log("show") }, left: function () { console.log("left") }, right: function () { console.log("right") } } } toggle (state) { state() } } var menu = new Menu() console.log(menu) menu.toggle(menu.menuStates.show) menu.toggle(menu.menuStates.hide)
上面圖片就是我們得到的結(jié)果我們會發(fā)現(xiàn)menu構(gòu)造函數(shù)是擁有四個狀態(tài)函數(shù),我們通過使用toggle函數(shù)來調(diào)用我們的函數(shù),其實說白了狀態(tài)模式相對于其它模式還是比較簡單的,但是對于它的使用場景你要了解,你是否可以真正的運(yùn)用它,以及把它放在適用的場景上。
狀態(tài)模式是指允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類。以逗號分割,把這句話分為兩部分來看。第一部分的意思是將狀態(tài)封裝成獨(dú)立的類,并將請求委托給當(dāng)前的狀態(tài)對象,當(dāng)對象的內(nèi)部狀態(tài)改變時,會帶來不同的行為變化。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105155.html
摘要:簡介狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。狀態(tài)通常為一個或多個枚舉常量的表示。簡而言之,當(dāng)遇到很多同級或者的時候,可以使用狀態(tài)模式來進(jìn)行簡化。 1. 簡介 狀態(tài)模式(State)允許一個對象在其內(nèi)部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。其實就是用一個對象或者數(shù)組記錄一組狀態(tài),每個狀態(tài)對應(yīng)一個實現(xiàn),實現(xiàn)的時候根據(jù)狀態(tài)挨個去運(yùn)...
摘要:備忘錄模式常常與命令模式和迭代子模式一同使用。自述歷史所謂自述歷史模式實際上就是備忘錄模式的一個變種。在備忘錄模式中,發(fā)起人角色負(fù)責(zé)人角色和備忘錄角色都是獨(dú)立的角色。 備忘錄模式(Memento Pattern)屬于行為型模式的一種,在不破壞封裝特性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣就可以將該對象恢復(fù)到原先保存的狀態(tài)。 概述 備忘錄模式又叫做快照模式(...
摘要:要注意這里的一個狀態(tài)行為因為這個詞是狀態(tài)模式中最重要的個概念??紤]到這點(diǎn),聰明的在中推出了狀態(tài)機(jī)這個偽函數(shù),能夠幫助我們快速實現(xiàn)狀態(tài)化。這里就引入了狀態(tài)機(jī)這個概念,以及和他對應(yīng)的狀態(tài)表。 ?首先聲明一點(diǎn),這個模式是我目前見過最好用(本人觀點(diǎn)),但是也是最難理解的一個(本人觀點(diǎn))。 所以大家需要做好心理準(zhǔn)備,如果,對這個模式?jīng)]有特別強(qiáng)烈的需求,比如: 我有一個Button,我按次數(shù)點(diǎn)擊它...
摘要:為了實現(xiàn)這個正義偷笑又合理的訴求,你得先學(xué)會今天要介紹的設(shè)計模式,因為你們公司的這個流程可能就是用今天這個模式設(shè)計的。狀態(tài)模式對開閉原則的支持并不太好,新增狀態(tài)時,不僅得增加狀態(tài)類,還得修改原來已經(jīng)有的狀態(tài),讓之前的狀態(tài)切換到新增的狀態(tài)。一、定義你是否經(jīng)常請(偷)假(懶)?是不是對公司萬惡的請假申請流程深惡痛絕。有沒有想過偷偷改造這個萬惡的系統(tǒng),從 申請->項目經(jīng)理審批->部門審批->老板審...
摘要:有限狀態(tài)機(jī)可以歸納出四個要素現(xiàn)態(tài)即當(dāng)前的狀態(tài)。但狀態(tài)模式還有一點(diǎn)需要注意到,當(dāng)采用子類繼承實現(xiàn)多種具體狀態(tài)的時候,注意控制狀態(tài)的數(shù)量,以免出現(xiàn)子類數(shù)量膨脹的現(xiàn)象在使用或等更完整面向?qū)ο笳Z言時。 業(yè)務(wù)代碼開發(fā)久了,偶爾看看設(shè)計模式,總會讓自己有一種清新脫俗的感覺??傁氚堰@種感覺記下來,但一想到要先起個恰如其分的標(biāo)題和開頭,就讓我有一種百爪撓心的糾結(jié),所以遲遲沒有開始。今天起更新我學(xué)習(xí)設(shè)計...
閱讀 1794·2023-04-25 22:42
閱讀 2218·2021-09-22 15:16
閱讀 3496·2021-08-30 09:44
閱讀 493·2019-08-29 16:44
閱讀 3316·2019-08-29 16:20
閱讀 2523·2019-08-29 16:12
閱讀 3395·2019-08-29 16:07
閱讀 673·2019-08-29 15:08