在狀態模式(state pattern)中,類的行為是基於它的狀態改變的。這種型別的設計模式屬於行為型模式。
在狀態模式中,我們建立表示各種狀態的物件和乙個行為隨著狀態物件改變而改變的 context 物件。
允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。
物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為。
**中包含大量與物件狀態有關的條件語句。
將各種具體的狀態類抽象出來。
封裝了轉換規則。
列舉可能的狀態,在列舉狀態之前需要確定狀態種類。
將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。
允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。
可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數。
狀態模式的使用必然會增加系統類和物件的個數。
狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂。
狀態模式對"開閉原則"的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源**。
行為隨狀態改變而改變的場景。
條件. 分支語句的代替者。
在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個
做頭髮狀態:
準備開始結束
abstractmethoderror.js
export default class abstractmethoderror extends error
}
haircut.js
export default class haircut
setstate(state) 我現在$`)
}}
prestate.js
import state from "./state";
export default class prestate extends state
run()
}
startstate.js
import state from "./state";
export default class startstate extends state
run()
}
state.js
import abstractmethoderror from "./abstractmethoderror";
export default class state
run()
}
stopstate.js
import state from "./state";
export default class stopstate extends state
run()
}
測試demo:
import haircut from "./src/haircut";
import prestate from "./src/prestate";
import startstate from "./src/startstate";
import stopstate from "./src/stopstate";
export default ;
const context = new haircut(user);
//模擬狀態操作(pre)
settimeout(() => , 1000);
//模擬狀態操作(start)
settimeout(() => , 1000);
//模擬狀態操作(stop)
settimeout(() => , 1000);
}};
參考:
設計模式之狀態模式
一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...
設計模式之 狀態模式
gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...
設計模式之狀態模式
定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...