最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS設(shè)計模式之狀態(tài)模式的用法使用方法

 更新時間:2023年08月27日 10:00:01   作者:慕仲卿  
JavaScript狀態(tài)模式是一種行為型設(shè)計模式,核心是對象在其內(nèi)部狀態(tài)改變時改變其行為,狀態(tài)模式將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同狀態(tài)下可以選擇不同的行為,本文給大家詳細的介紹一下狀態(tài)設(shè)計模式在Js中的使用,需要的朋友可以參考下

狀態(tài)模式(State Pattern)

一種行為型設(shè)計模式,核心是對象在其內(nèi)部狀態(tài)改變時改變其行為。

狀態(tài)模式將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同狀態(tài)下可以選擇不同的行為。

組成

  • 環(huán)境類:環(huán)境類是擁有狀態(tài)的對象,它在運行時將自身的操作委托給當前的狀態(tài)對象來處理。①環(huán)境類維護一個對抽象狀態(tài)類的引用,②并通過該引用來調(diào)用具體狀態(tài)類的方法。

  • 抽象狀態(tài)類:抽象狀態(tài)類定義了一個接口③,用于封裝與環(huán)境類的特定狀態(tài)相關(guān)的行為。

  • 具體狀態(tài)類:具體狀態(tài)類實現(xiàn)了抽象狀態(tài)類定義的接口,它具體描述了在某個狀態(tài)下對象的行為④。

工作流程

  • 環(huán)境類通過持有一個抽象狀態(tài)類的引用來表示當前的狀態(tài)。

  • 客戶端通過調(diào)用環(huán)境類的方法來觸發(fā)某個操作。

  • 環(huán)境類在運行時將操作委托給當前狀態(tài)對象進行處理。

  • 當對象的狀態(tài)發(fā)生改變時,環(huán)境類會更新當前狀態(tài)對象的引用,從而改變對象的行為。

趣例

下面的這個例子展示了一位西安老鐵觀看國足比賽的時候的心理狀態(tài)變化過程:

abstract class State {
? constructor(public context: Context | null = null) {}
? // 這里體現(xiàn)出③:用于封裝與環(huán)境類的特定狀態(tài)相關(guān)的行為
? handle() {
? ? if (!this.context) {
? ? ? console.log("找不到老鐵了!");
? ? } else {
? ? ? this.exec();
? ? }
? }
? next<T extends State>(NextState: new (context: Context) => T) {
? ? if (!this.context) {
? ? ? console.log("找不到老鐵了!");
? ? } else {
? ? ? this.context.to(new NextState(this.context));
? ? }
? }
? abstract exec(): any;
}
// 具體狀態(tài)類
class StateA extends State {
? // 這里體現(xiàn)出④:用于封裝與環(huán)境類的特定狀態(tài)相關(guān)的行為
? exec() {
? ? console.log("買票");
? ? this.next(StateB);
? }
}
class StateB extends State {
? exec() {
? ? console.log("坐車");
? ? this.next(StateC);
? }
}
class StateC extends State {
? exec() {
? ? console.log("看球");
? ? this.next(StateO);
? }
}
class StateO extends State {
? exec() {
? ? throw new Error('已經(jīng)結(jié)束了');
? }
}
// 環(huán)境類
class Context {
? // 這里體現(xiàn)出①:環(huán)境類維護一個對抽象狀態(tài)類的引用,即cts
? constructor(public cts: State | null = null) {}
? to(state: State) {
? ? console.log(`Transitioning to ${state.constructor.name}`);
? ? this.cts = state;
? }
? do() {
? ? // 這里體現(xiàn)出②:通過該引用來調(diào)用具體狀態(tài)類的方法
? ? this.cts?.handle();
? }
}
// 使用示例
const context = new Context();
const stateA = new StateA(context);
context.to(stateA);
while(1){
? try {
? ? context.do();
? } catch {
? ? console.log('肯定輸了!');
? ? break;
? }
}

對照例子理解

  • 狀態(tài)模式:一種行為型設(shè)計模式,核心是①【對象】在其②【內(nèi)部狀態(tài)】③【改變】時④【改變其行為】。
  • ①對象:指的是環(huán)境類對象,也就是上述代碼中的context對象。

  • ②內(nèi)部狀態(tài),指的是context引用的狀態(tài)類實例,也就是stateA以及NextState的匿名實例。

  • ③改變:指的是context.to的調(diào)用。

  • ④行為:指的是context.do函數(shù)的執(zhí)行結(jié)果。

  • 改變其行為:指的是context.cts引用不同的狀態(tài)類實例的時候context.do的執(zhí)行結(jié)果不同。

  • 狀態(tài)模式將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同狀態(tài)下可以選擇不同的行為。

    這句話理解成:

    • 本來應(yīng)該在context.do中通過if else實現(xiàn)的功能,被封裝到了不同的狀態(tài)類中(StateA StateB);

    • 當context的狀態(tài)改變的時候(即:context.cts引用不同的狀態(tài)類實例的時候)context.do也能實現(xiàn)封裝前相同的功能(即表現(xiàn)出不同的行為)。

見下面代碼:

不使用狀態(tài)設(shè)計模式實現(xiàn)上述代碼功能:

class Context {
? state = 'A';
? to(state: string) {
? ? console.log(`Transitioning to state ${state}`);
? ? this.state = state;
? }
? do() {
? ? if(this.state === 'A'){
? ? ? console.log("買票");
? ? ? this.to('B');
? ? } else if (this.state === 'B') {
? ? ? console.log("坐車");
? ? ? this.to('C');
? ? } else if (this.state === 'C') {
? ? ? console.log("看球");
? ? ? this.to('D');
? ? } else if (this.state === 'D') {
? ? ? throw new Error('已經(jīng)結(jié)束了');
? ? }
? }
}
const context = new Context();
while(1){
? try {
? ? context.do();
? } catch {
? ? console.log('肯定輸了!');
? ? break;
? }
}

【對比】雖然這樣看起來代碼量好像少了一些,但是如果老鐵想要在下車后去趟衛(wèi)生間,使用了狀態(tài)設(shè)計模式的代碼只需要修改StateB的實現(xiàn)就可以了,而后者則必須修改Context中的do方法!

優(yōu)點

  • 封裝之后的狀態(tài)可以獨立變化,符合開閉原則。

  • 狀態(tài)模式提供了一種清晰的方式來組織對象的行為,并避免了使用大量的條件語句。

缺點

  • 狀態(tài)較多時,導(dǎo)致狀態(tài)類的數(shù)量增加,增加系統(tǒng)的復(fù)雜性。

  • 對象在不同狀態(tài)下的轉(zhuǎn)換邏輯可能會分散在多個狀態(tài)類中,使得代碼難以理解和維護。

  • 如果某個狀態(tài)只被一個對象使用,可以考慮使用策略模式替代狀態(tài)模式。

應(yīng)用

狀態(tài)模式常見于需要根據(jù)對象的內(nèi)部狀態(tài)來改變其行為的場景,例如【訂單狀態(tài)的處理】、【游戲角色的狀態(tài)轉(zhuǎn)換】等。

它提供了一種可擴展的方式來處理狀態(tài)相關(guān)的邏輯,并促進了代碼的靈活性和可維護性。

generator函數(shù)可以看成原生js實現(xiàn)了狀態(tài)設(shè)計模式。

感性記憶

同一個對象,當其內(nèi)部維護的狀態(tài)不同的時候,調(diào)用其上的同一個方法,可能會得到完全不同的結(jié)果。

總結(jié)

就是適用于同一個對象具有不同的狀態(tài),并且在各個狀態(tài)下表現(xiàn)不一致的情況;這些狀態(tài)之間如果是可以相互轉(zhuǎn)換的,使用此設(shè)計模式就更加合適了。

到此這篇關(guān)于JS設(shè)計模式之狀態(tài)模式的用法使用方法的文章就介紹到這了,更多相關(guān)JS狀態(tài)模式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)自上而下字幕滾動

    微信小程序?qū)崿F(xiàn)自上而下字幕滾動

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)自上而下字幕滾動,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • JS中比Switch...Case更優(yōu)雅的多條件判斷寫法

    JS中比Switch...Case更優(yōu)雅的多條件判斷寫法

    這篇文章主要給大家介紹了關(guān)于JS中比Switch...Case更優(yōu)雅的多條件判斷寫法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • js window.addEventListener實際案例

    js window.addEventListener實際案例

    window.addEventListener 是 JavaScript 中的一個方法,用于向指定對象添加事件監(jiān)聽器,下面通過本文給大家介紹js window.addEventListener的實際案例,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 淺談js獲取ModelAndView值的問題

    淺談js獲取ModelAndView值的問題

    下面小編就為大家分享一篇淺談js獲取ModelAndView值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • javascript實現(xiàn)隨機抽獎功能

    javascript實現(xiàn)隨機抽獎功能

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)隨機抽獎功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • js實現(xiàn)返回頂部效果

    js實現(xiàn)返回頂部效果

    本文主要介紹了js實現(xiàn)返回頂部效果的實例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • js實現(xiàn)純前端壓縮圖片

    js實現(xiàn)純前端壓縮圖片

    這篇文章主要為大家詳細介紹了js實現(xiàn)純前端壓縮圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • function foo的原型與prototype屬性解惑

    function foo的原型與prototype屬性解惑

    最近在研究js,疑惑也比較多。主要是被原型這個東西給弄迷糊了。
    2010-11-11
  • JavaScript模擬實現(xiàn)繼承的方法

    JavaScript模擬實現(xiàn)繼承的方法

    這篇文章主要介紹了JavaScript模擬實現(xiàn)繼承的方法,實例分析了javascript類的操作與模擬實現(xiàn)繼承的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 使用typescript+webpack構(gòu)建一個js庫的示例詳解

    使用typescript+webpack構(gòu)建一個js庫的示例詳解

    這篇文章主要介紹了typescript+webpack構(gòu)建一個js庫,本文主要記錄使用typescript配合webpack打包一個javascript library的配置過程,需要的朋友可以參考下
    2022-07-07

最新評論

张家界市| 潮州市| 金秀| 尉犁县| 耒阳市| 紫阳县| 眉山市| 交城县| 阿克陶县| 赣州市| 广平县| 宁海县| 亳州市| 罗山县| 建始县| 财经| 子长县| 桃江县| 米易县| 绵竹市| 唐河县| 蚌埠市| 本溪市| 玛曲县| 施甸县| 诸城市| 久治县| 永嘉县| 安仁县| 平遥县| 江口县| 涞水县| 广宁县| 青川县| 博乐市| 公主岭市| 民勤县| 宁强县| 景德镇市| 安塞县| 瑞丽市|