您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“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è)資訊頻道。
免責聲明:本站發(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)容。