當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JS 状态模式
1. 簡介
狀態(tài)模式(State)允許一個對象在其內(nèi)部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。
其實就是用一個對象或者數(shù)組記錄一組狀態(tài),每個狀態(tài)對應一個實現(xiàn),實現(xiàn)的時候根據(jù)狀態(tài)挨個去運行實現(xiàn)。
2. 實現(xiàn)
比如超級瑪麗,就可能同時有好幾個狀態(tài)比如 跳躍,移動,射擊,蹲下 等,如果對這些動作一個個進行處理判斷,需要多個if-else或者switch不僅丑陋不說,而且在遇到有組合動作的時候,實現(xiàn)就會變的更為復雜,這里可以使用狀態(tài)模式來實現(xiàn)。
狀態(tài)模式的思路是:首先創(chuàng)建一個狀態(tài)對象或者數(shù)組,內(nèi)部保存狀態(tài)變量,然后內(nèi)部封裝好每種動作對應的狀態(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) { // 更改當前動作_currentState = arrreturn 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) { // 更改當前動作this._currentState = arrreturn 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. 總結
狀態(tài)模式的使用場景也特別明確,有如下兩點:
簡而言之,當遇到很多同級if-else或者switch的時候,可以使用狀態(tài)模式來進行簡化。
本文是系列文章,可以相互參考印證,共同進步~
網(wǎng)上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發(fā)現(xiàn)錯誤,歡迎留言指出~
參考:《Javascript 設計模式》 - 張榮銘
設計模式之狀態(tài)模式
總結
- 上一篇: 专家利用 AI 生成的语音成功通过银行语
- 下一篇: 福特前 CEO:特斯拉仍是电动汽车标杆,