溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

State狀態(tài)模式怎么實現(xiàn)

發(fā)布時間:2022-03-25 10:46:11 來源:億速云 閱讀:106 作者:iii 欄目:web開發(fā)

本文小編為大家詳細介紹“State狀態(tài)模式怎么實現(xiàn)”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“State狀態(tài)模式怎么實現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

舉例子

團隊接口人

團隊是由很多同學組成的,但有一位接口人 TL,這位 TL 可能一會兒和產(chǎn)品經(jīng)理談需求,一會兒和其他 TL 談規(guī)劃,一會兒和 HR 談人事,總之要做很多事情,很顯然一個人是忙不過來的。TL 通過將任務(wù)分發(fā)給團隊中每個同學,而不讓他們直接和產(chǎn)品經(jīng)理、其他 TL、HR 接觸,那么這位 TL 的辦事效率就會相當高,因為每個同學只負責一塊具體的業(yè)務(wù),而 TL 在不同時刻叫上不同的同學,讓他們出面解決他們負責的專業(yè)領(lǐng)域問題,那么在外面看,這位 TL 團隊能力很廣,在內(nèi)看,每個人負責的事情也比較單一。

臺燈按鈕

我們經(jīng)常會看到只有一個按鈕的臺燈,但是可以通過按鈕調(diào)節(jié)亮度,大概是如下一個循環(huán) “關(guān) -> 弱光 -> 亮 -> 強光 -> 關(guān)”,那么每次按按鈕后,要跳轉(zhuǎn)到什么狀態(tài),其實和當前狀態(tài)有關(guān)。我們可以用 if else 解決這個問題,也可以用狀態(tài)模式解決。

用狀態(tài)模式解決,就是將這四個狀態(tài)封裝為四個類,每個類都執(zhí)行按下按鈕后要跳轉(zhuǎn)到的狀態(tài),這樣未來新增一種模式,只要改變部分類即可。

數(shù)據(jù)庫連接器

在數(shù)據(jù)庫連接前后,這個連接器的狀態(tài)顯然非常不同,我們?nèi)绻麅H用一個類描述數(shù)據(jù)庫連接器,則內(nèi)部免不了寫大量分支語句進行狀態(tài)判斷。那么此時有更好的方案嗎?狀態(tài)模式告訴我們,可以創(chuàng)建多個不同狀態(tài)類,比如連接前、連接中、連接后三種狀態(tài)類,在不同時刻內(nèi)部會替換為不同的子類,它們都繼承同樣的父類,所以外面看上去不需要感知內(nèi)部的狀態(tài)變化,內(nèi)部又可以進行狀態(tài)拆分,進行更好的維護。

意圖解釋

意圖:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。

重點在 “內(nèi)部狀態(tài)” 的理解,也就是狀態(tài)改變是由對象內(nèi)部觸發(fā)的,而不是外部,所以 外部根本無需關(guān)心對象是否用了狀態(tài)模式,拿數(shù)據(jù)庫連接器的例子來說,不管這個類是用 if else 堆砌的,還是用狀態(tài)模式做的,都完全不妨礙它對外提供的穩(wěn)定 API(接口問題),所以狀態(tài)模式實質(zhì)上是一種內(nèi)聚的設(shè)計模式。

結(jié)構(gòu)圖

State: 狀態(tài)接口,類比為臺燈狀態(tài)。

ConcreteState: 具體狀態(tài),都繼承于 State,類比為臺燈的強光、弱光狀態(tài)。

代碼例子

下面例子使用 typescript 編寫。

// 定義狀態(tài)接口

interface State {

  // 模擬臺燈點亮

  show: () => string

}

class Light1 implements State {

  constructor(context: Context) {

    this.context = context

  }

  show() {

    return '關(guān)燈'

  }

  // 按下按鈕

  public click() {

    this.context.setState(new Light2(this.context))

  }

}

class Light2 implements State {

  constructor(context: Context) {

    this.context = context

  }

  show() {

    return '弱光'

  }

  // 按下按鈕

  public click() {

    this.context.setState(new Light3(this.context))

  }

}

class Light3 implements State {

  constructor(context: Context) {

    this.context = context

  }

  show() {

    return '亮'

  }

  // 按下按鈕

  public click() {

    this.context.setState(new Light4(this.context))

  }

}

class Light4 implements State {

  constructor(context: Context) {

    this.context = context

  }

  show() {

    return '強光'

  }

  // 按下按鈕

  public click() {

    this.context.setState(new Light1(this.context))

  }

}

// 臺燈

public class Lamp {

  // 當前狀態(tài)

  private currentState = new Light1(this)

  protected setState(state: State) {

    this.currentState = state

  }

  // 按下按鈕

  public click() {

    this.getState().click()

  }

}

const lamp = new Lamp() // 關(guān)閉

lamp.click() // 弱光

lamp.click() // 亮

lamp.click() // 強光

lamp.click() // 關(guān)閉

其實有很多種方式來實現(xiàn),不必拘泥于形式,大體上只要保證由多個類實現(xiàn)不同狀態(tài),每個類實現(xiàn)到下一個狀態(tài)切換就好了。

讀到這里,這篇“State狀態(tài)模式怎么實現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI