當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JS 状态模式
1. 簡介
狀態模式(State)允許一個對象在其內部狀態改變的時候改變它的行為,對象看起來似乎修改了它的類。
其實就是用一個對象或者數組記錄一組狀態,每個狀態對應一個實現,實現的時候根據狀態挨個去運行實現。
2. 實現
比如超級瑪麗,就可能同時有好幾個狀態比如 跳躍,移動,射擊,蹲下 等,如果對這些動作一個個進行處理判斷,需要多個if-else或者switch不僅丑陋不說,而且在遇到有組合動作的時候,實現就會變的更為復雜,這里可以使用狀態模式來實現。
狀態模式的思路是:首先創建一個狀態對象或者數組,內部保存狀態變量,然后內部封裝好每種動作對應的狀態,然后狀態對象返回一個接口對象,它可以對內部的狀態修改或者調用。
const SuperMarry = (function() { let _currentState = [], // 狀態數組states = {jump() {console.log('跳躍!')},move() {console.log('移動!')},shoot() {console.log('射擊!')},squat() {console.log('蹲下!')}}const Action = {changeState(arr) { // 更改當前動作_currentState = arrreturn this},goes() {console.log('觸發動作')_currentState.forEach(T => states[T] && states[T]())return this}}return {change: Action.changeState,go: Action.goes} })()SuperMarry.change(['jump', 'shoot']).go() // 觸發動作 跳躍! 射擊!.go() // 觸發動作 跳躍! 射擊!.change(['squat']).go() // 觸發動作 蹲下!這里可以使用ES6的class優化一下:
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('觸發動作')this._currentState.forEach(T => this.states[T] && this.states[T]())return this} }new SuperMarry().change(['jump', 'shoot']).go() // 觸發動作 跳躍! 射擊!.go() // 觸發動作 跳躍! 射擊!.change(['squat']).go() // 觸發動作 蹲下!3. 總結
狀態模式的使用場景也特別明確,有如下兩點:
簡而言之,當遇到很多同級if-else或者switch的時候,可以使用狀態模式來進行簡化。
本文是系列文章,可以相互參考印證,共同進步~
網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發現錯誤,歡迎留言指出~
參考:《Javascript 設計模式》 - 張榮銘
設計模式之狀態模式
總結
- 上一篇: 专家利用 AI 生成的语音成功通过银行语
- 下一篇: 理解SpringMVC-------Di