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