日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(十二)状态模式

發布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (十二)状态模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

狀態模式

  • 狀態模式
  • 狀態模式 介紹
    • 概念
    • 示例
  • 狀態模式 演示
  • 狀態模式 場景
    • 有限狀態機(finite state machine)
    • 實現一個簡單的 Promise
  • 狀態模式 總結

狀態模式

  • 介紹
  • 演示
  • 場景
  • 總結

狀態模式 介紹

  • 一個對象有狀態變化
  • 每次狀態變化都會觸發一個邏輯
  • 不能總是用if…else來控制

概念

一個對象或者實例可能會有不同狀態的變化(例如交通信號燈),如果僅用if...else去處理狀態變化,擴展性非常差,特別是針對復雜的狀態變化。狀態模式就提出了一種處理復雜狀態變化且擴展性好的設計思路。

示例

  • 交通信號燈不同顏色的變化
  • 狀態模式 演示

傳統的 UML 類圖

簡化之后的 UML 類圖

代碼演示

class State {constructor(color) {this.color = color}handle(context) {console.log(`turn to ${this.color} light`)context.setState(this)} }class Context {constructor() {this.state = null}setState(state) {this.state = state}getState() {return this.state} }// 測試代碼 let context = new Context()let greed = new State('greed') let yellow = new State('yellow') let red = new State('red')// 綠燈亮了 greed.handle(context) console.log(context.getState()) // 黃燈亮了 yellow.handle(context) console.log(context.getState()) // 紅燈亮了 red.handle(context) console.log(context.getState())

狀態模式 場景

有限狀態機(finite state machine)

  • 有限個狀態
  • 以及在這些狀態之間的變化 如交通信號燈
  • 使用開源lib:javascript-state-machine

表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型,例如上一節的交通信號燈的狀態變化。

有一個開源 lib javascript-state-machine 實現了有限狀態機的功能。我們使用它來模擬一個比較常用的操作,“收藏”和“取消收藏”

// 狀態機模型 var fsm = new StateMachine({init: '收藏', // 初始狀態,待收藏transitions: [{name: 'doStore',from: '收藏',to: '取消收藏'},{name: 'deleteStore',from: '取消收藏',to: '收藏'}],methods: {// 執行收藏onDoStore: function () {alert('收藏成功')updateText()},// 取消收藏onDeleteStore: function () {alert('已取消收藏')updateText()}} })var $btn = $('#btn')// 點擊事件 $btn.click(function () {if (fsm.is('收藏')) {fsm.doStore()} else {fsm.deleteStore()} })// 更新文案 function updateText() {$btn.text(fsm.state) }// 初始化文案 updateText()

實現一個簡單的 Promise

先回歸一下 Promise 的語法

function loadImg(src) {const promise = new Promise(function (resolve, reject) {var img = document.createElement('img')img.onload = function () {resolve(img)}img.onerror = function () {reject()}img.src = src})return promise }var src = 'http://www.imooc.com/static/img/index/logo_new.png' var result = loadImg(src)result.then(function (img) {console.log('success 1') }, function () {console.log('failed 1') }) result.then(function (img) {console.log('success 2') }, function () {console.log('failed 2') })

Promise 就是一個有限狀態機,有三個狀態pending fullfilled rejected,其中的變化必須是pending -> fullfilled 或者pending -> rejected,不能逆向變化,這樣就可以根據有限狀態即實現一個基本的 Promise

// 模型 var fsm = new StateMachine({init: 'pending',transitions: [{name: 'resolve',from: 'pending',to: 'fullfilled'},{name: 'reject',from: 'pending',to: 'rejected'}],methods: {// 成功onResolve: function (state, data) {// 參數:state - 當前狀態示例; data - fsm.resolve(xxx) 執行時傳遞過來的參數data.successList.forEach(fn => fn())},// 失敗onReject: function (state, data) {// 參數:state - 當前狀態示例; data - fsm.reject(xxx) 執行時傳遞過來的參數data.failList.forEach(fn => fn())}} })// 定義 Promise class MyPromise {constructor(fn) {this.successList = []this.failList = []fn(() => {// resolve 函數fsm.resolve(this)}, () => {// reject 函數fsm.reject(this)})}then(successFn, failFn) {this.successList.push(successFn)this.failList.push(failFn)} }

然后測試一下

// 測試代碼 function loadImg(src) {const promise = new MyPromise(function (resolve, reject) {var img = document.createElement('img')img.onload = function () {resolve(img)}img.onerror = function () {reject()}img.src = src})return promise } var src = 'http://www.imooc.com/static/img/index/logo_new.png' var result = loadImg(src) console.log(result)result.then(function (img) {console.log('success 1') }, function () { console.log('failed 1') }) result.then(function (img) {console.log('success 2') }, function () { console.log('failed 2') })

注意,本節以講解狀態模式位置,僅實現了簡單的 Promise 原型,Promise 其他高級功能大家可自行去擴展

狀態模式 總結

  • 狀態模式是什么
  • 主要解決什么問題
  • 核心:不同狀態變化的邏輯,分離實現,而不是用if...else放在一起判斷
  • 有限狀態機

和觀察者模式的對比:兩者之間沒有矛盾,而是狀態模式中可以使用觀察者模式。
- 狀態模式:不同狀態的變化帶來的改變。類似于多種if..else的邏輯。
- 觀察者模式:先訂閱、后發布,觸發訂閱。類似于一次性觸發多個事件,并沒有if...else的判斷。

設計原則驗證:

  • 將狀態對象和主題對象分離,狀態的變化邏輯單獨處理
  • 符合開放封閉原則

總結

以上是生活随笔為你收集整理的(十二)状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩簧片在线观看 | 日韩午夜激情视频 | www 在线观看视频 | 精品一区二区在线观看视频 | 麻豆传媒一区 | www.亚洲.com| 国产女在线 | 老妇裸体性猛交视频 | 麻豆视频免费版 | 亚洲国产精品成人综合 | av资源免费观看 | 亚洲人在线 | 国产精品免费视频一区二区三区 | 日本一本二本三区免费 | 精品福利三区3d卡通动漫 | 尤物精品在线 | 国产无套内射又大又猛又粗又爽 | 日本阿v视频在线观看 | 欧美视频免费 | 日韩夜夜操| 中文日韩 | 精品一区二区三区毛片 | 亚洲综合一区二区三区 | 国产sss| 日本黄色免费大片 | 日韩插插插| 亚洲你懂得 | 精品九九九九 | 操操操操操操操 | 日韩毛片在线播放 | 日韩久久免费视频 | 国产乱色精品成人免费视频 | 国产精品无码一区二区桃花视频 | 黄色国产在线 | 男人天堂b | 天天综合国产 | 91看片在线观看 | 精品久久免费 | 四虎黄网| 国产亚洲欧美视频 | 五月激情丁香 | 日本少妇激情舌吻 | 欧美日韩激情在线一区二区三区 | 亚洲欧美一区二区三区 | 男生女生羞羞网站 | 3o一40一50一6o女人毛片 | 黄色一级生活片 | 国产福利精品在线观看 | 欧美亚洲精品在线 | 69精品视频| 伊人中文在线 | www.色网 | 都市激情校园春色 | 欧美日韩高清一区二区三区 | 免费看女生裸体视频 | 在线91观看 | 涩涩av | 一级毛毛片 | 99中文字幕在线观看 | 一区二区三区精品视频在线观看 | 国产午夜一级片 | 国产一二三| 大屁股一区二区三区 | 国产精品一二三区在线观看 | 韩国伦理在线看 | 午夜日韩视频 | 日本少妇毛茸茸高潮 | jizz中国女人 | 网站在线播放 | a在线v| 婷婷激情电影 | 欧美亚洲一二三区 | 乱老熟女一区二区三区 | 久久成人黄色 | 亚洲欧洲一级 | 中文字幕1区2区3区 www.com黄色片 | 女人脱下裤子让男人捅 | 国产精品欧美一区二区 | 污视频网站免费观看 | 久天堂 | www在线播放 | 成人91免费| 日本加勒比一区二区 | 亚洲av片一区二区三区 | 国产不卡二区 | 日韩精品视频一区二区三区 | 欧美成人激情在线 | 国产手机在线播放 | 国产欧美日韩精品区一区二污污污 | 神马午夜51 | 91美女视频网站 | 中文亚洲av片不卡在线观看 | 91激情捆绑调教喷水 | 日本老肥婆bbbwbbbwzr | 亚洲四虎影院 | 色婷av | 国产日产精品一区二区三区 | 日韩在线黄色 | 国产区视频在线观看 |