摘要:簡介狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。狀態(tài)通常為一個或多個枚舉常量的表示。簡而言之,當(dāng)遇到很多同級或者的時候,可以使用狀態(tài)模式來進行簡化。
1. 簡介
狀態(tài)模式(State)允許一個對象在其內(nèi)部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。
其實就是用一個對象或者數(shù)組記錄一組狀態(tài),每個狀態(tài)對應(yīng)一個實現(xiàn),實現(xiàn)的時候根據(jù)狀態(tài)挨個去運行實現(xiàn)。
比如超級瑪麗,就可能同時有好幾個狀態(tài)比如 跳躍,移動,射擊,蹲下 等,如果對這些動作一個個進行處理判斷,需要多個if-else或者switch不僅丑陋不說,而且在遇到有組合動作的時候,實現(xiàn)就會變的更為復(fù)雜,這里可以使用狀態(tài)模式來實現(xiàn)。
狀態(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)用。
const SuperMarry = (function() { let _currentState = [], // 狀態(tài)數(shù)組 states = { jump() {console.log("跳躍!")}, move() {console.log("移動!")}, shoot() {console.log("射擊!")}, squat() {console.log("蹲下!")} } const Action = { changeState(arr) { // 更改當(dāng)前動作 _currentState = arr return this }, goes() { console.log("觸發(fā)動作") _currentState.forEach(T => states[T] && states[T]()) return this } } return { change: Action.changeState, go: Action.goes } })() SuperMarry .change(["jump", "shoot"]) .go() // 觸發(fā)動作 跳躍! 射擊! .go() // 觸發(fā)動作 跳躍! 射擊! .change(["squat"]) .go() // 觸發(fā)動作 蹲下!
這里可以使用ES6的class優(yōu)化一下:
class SuperMarry { constructor() { this._currentState = [] this.states = { jump() {console.log("跳躍!")}, move() {console.log("移動!")}, shoot() {console.log("射擊!")}, squat() {console.log("蹲下!")} } } change(arr) { // 更改當(dāng)前動作 this._currentState = arr return this } go() { console.log("觸發(fā)動作") this._currentState.forEach(T => this.states[T] && this.states[T]()) return this } } new SuperMarry() .change(["jump", "shoot"]) .go() // 觸發(fā)動作 跳躍! 射擊! .go() // 觸發(fā)動作 跳躍! 射擊! .change(["squat"]) .go() // 觸發(fā)動作 蹲下!3. 總結(jié)
狀態(tài)模式的使用場景也特別明確,有如下兩點:
一個對象的行為取決于它的狀態(tài),并且它必須在運行時刻根據(jù)狀態(tài)改變它的行為。
一個操作中含有大量的分支語句,而且這些分支語句依賴于該對象的狀態(tài)。狀態(tài)通常為一個或多個枚舉常量的表示。
簡而言之,當(dāng)遇到很多同級if-else或者switch的時候,可以使用狀態(tài)模式來進行簡化。
本文是系列文章,可以相互參考印證,共同進步~
JS 抽象工廠模式
JS 工廠模式
JS 建造者模式
JS 原型模式
JS 單例模式
JS 回調(diào)模式
JS 外觀模式
JS 適配器模式
JS 利用高階函數(shù)實現(xiàn)函數(shù)緩存(備忘模式)
JS 狀態(tài)模式
JS 橋接模式
JS 觀察者模式
網(wǎng)上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學(xué)習(xí)過程中的總結(jié),如果發(fā)現(xiàn)錯誤,歡迎留言指出~
參考:
《Javascript 設(shè)計模式》 - 張榮銘
設(shè)計模式之狀態(tài)模式
PS:歡迎大家關(guān)注我的公眾號【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://hztianpu.com/yun/92265.html
摘要:介一回聊狀態(tài)模式,官方描述允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。有限狀態(tài)機有限狀態(tài)機是一個非常有用的模型,可以模擬世界上大部分事物。這個是官方說法,簡單說,她有三個特征,狀態(tài)總數(shù)是有限的。,任一時刻,只處在一種狀態(tài)之中。 本回內(nèi)容介紹 上一回聊了聊組合模式(Composite),用組合模式模擬了個圖片庫,聊了遞歸。介一回聊狀態(tài)模式(State),官方描述允許一個對象在其內(nèi)部狀態(tài)改...
摘要:一策略模式定義把一些小的算法封裝起來使他們之間可以相互替換把代碼的實現(xiàn)和使用分離開來利用策略模式實現(xiàn)小方塊緩動代碼代碼動畫已消耗時間原始位置目標(biāo)位置持續(xù)時間小球運動的時間要改變的屬性例如緩動算法記錄開始位置并設(shè)置定時器是否有要執(zhí)行的 一.策略模式 1.定義:把一些小的算法,封裝起來,使他們之間可以相互替換(把代碼的實現(xiàn)和使用分離開來)2.利用策略模式實現(xiàn)小方塊緩動 html代碼: ...
摘要:一策略模式定義把一些小的算法封裝起來使他們之間可以相互替換把代碼的實現(xiàn)和使用分離開來利用策略模式實現(xiàn)小方塊緩動代碼代碼動畫已消耗時間原始位置目標(biāo)位置持續(xù)時間小球運動的時間要改變的屬性例如緩動算法記錄開始位置并設(shè)置定時器是否有要執(zhí)行的 一.策略模式 1.定義:把一些小的算法,封裝起來,使他們之間可以相互替換(把代碼的實現(xiàn)和使用分離開來)2.利用策略模式實現(xiàn)小方塊緩動 html代碼: ...
摘要:以上就是狀態(tài)模式在實際開發(fā)中得應(yīng)用,我們結(jié)合了綜合應(yīng)用狀態(tài)模式。 在vue.js之類的mvvm的框架大行其道的當(dāng)下,開發(fā)中最常見的場景就是通過改變數(shù)據(jù)來展示頁面或模塊的不同狀態(tài),當(dāng)我們把mvvm玩的不亦樂乎的時候,有時也會停下了想想:在某些項目中不能用vuejs之類的框架時,我們怎么通過改變數(shù)據(jù)來修改頁面或者模塊的狀態(tài)呢。嗯。說到狀態(tài),就想到了狀態(tài)模式 狀態(tài)模式: 在很多情況下,一個對...
摘要:以上就是狀態(tài)模式在實際開發(fā)中得應(yīng)用,我們結(jié)合了綜合應(yīng)用狀態(tài)模式。 在vue.js之類的mvvm的框架大行其道的當(dāng)下,開發(fā)中最常見的場景就是通過改變數(shù)據(jù)來展示頁面或模塊的不同狀態(tài),當(dāng)我們把mvvm玩的不亦樂乎的時候,有時也會停下了想想:在某些項目中不能用vuejs之類的框架時,我們怎么通過改變數(shù)據(jù)來修改頁面或者模塊的狀態(tài)呢。嗯。說到狀態(tài),就想到了狀態(tài)模式 狀態(tài)模式: 在很多情況下,一個對...
閱讀 1312·2021-11-22 15:24
閱讀 4763·2021-09-23 11:51
閱讀 2477·2021-09-08 09:36
閱讀 3604·2019-08-30 15:43
閱讀 1386·2019-08-30 13:01
閱讀 1182·2019-08-30 12:48
閱讀 621·2019-08-29 12:52
閱讀 3470·2019-08-29 12:41