中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

State狀態模式怎么實現

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

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

舉例子

團隊接口人

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

臺燈按鈕

我們經常會看到只有一個按鈕的臺燈,但是可以通過按鈕調節亮度,大概是如下一個循環 “關 -> 弱光 -> 亮 -> 強光 -> 關”,那么每次按按鈕后,要跳轉到什么狀態,其實和當前狀態有關。我們可以用 if else 解決這個問題,也可以用狀態模式解決。

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

數據庫連接器

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

意圖解釋

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

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

結構圖

State: 狀態接口,類比為臺燈狀態。

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

代碼例子

下面例子使用 typescript 編寫。

// 定義狀態接口

interface State {

  // 模擬臺燈點亮

  show: () => string

}

class Light1 implements State {

  constructor(context: Context) {

    this.context = context

  }

  show() {

    return '關燈'

  }

  // 按下按鈕

  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 {

  // 當前狀態

  private currentState = new Light1(this)

  protected setState(state: State) {

    this.currentState = state

  }

  // 按下按鈕

  public click() {

    this.getState().click()

  }

}

const lamp = new Lamp() // 關閉

lamp.click() // 弱光

lamp.click() // 亮

lamp.click() // 強光

lamp.click() // 關閉

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

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

向AI問一下細節

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

AI

阿拉善盟| 林甸县| 交城县| 基隆市| 手游| 和政县| 陆良县| 辽宁省| 西乌珠穆沁旗| 三原县| 通山县| 大宁县| 广南县| 宝清县| 和田县| 东至县| 麟游县| 禄劝| 长岛县| 水城县| 舟曲县| 邵阳市| 大埔区| 阳高县| 临城县| 天柱县| 高淳县| 乳山市| 宁陵县| 嵊泗县| 宁晋县| 阜平县| 尚义县| 黔西| 拉萨市| 柳江县| 云南省| 玛曲县| 永新县| 潞城市| 宜丰县|