摘要:在狀態模式中,我們創建表示各種狀態的對象和一個行為隨著狀態對象改變而改變的對象。缺點狀態模式的使用必然會增加系統類和對象的個數。狀態模式是指允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
狀態模式
在狀態模式(State Pattern)中,類的行為是基于它的狀態改變的。這種類型的設計模式屬于行為型模式。意圖主要解決
在狀態模式中,我們創建表示各種狀態的對象和一個行為隨著狀態對象改變而改變的 context 對象。
允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它的類優點
對象的行為依賴于它的狀態(屬性),并且可以根據它的狀態改變而改變它的相關行為。
封裝了轉換規則。
枚舉可能的狀態,在枚舉狀態之前需要確定狀態種類。
將所有與某個狀態有關的行為放到一個類中,并且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行為。
允許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊。
可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數。
缺點狀態模式的使用必然會增加系統類和對象的個數。
狀態模式的結構與實現都較為復雜,如果使用不當將導致程序結構和代碼的混亂。
狀態模式對"開閉原則"的支持并不太好,對于可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源代碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源代碼。
狀態模式實現class Menu
我們使用es6實現一個類的創建, 便于我們多個地方重復使用,其實狀態模式是要根據你的狀態
來實現或者操作你想要的東西
class Menu{ }
狀態對象
創建一個狀態對象或者數組,內部保存狀態變量,然后內部封裝好每種動作對應的狀態,然后狀態對象返回一個接口對象,它可以對內部的狀態修改或者調用。
this.menuStates = { hide:function () { console.log("hide") }, show: function () { console.log("show") }, left: function () { console.log("left") }, right: function () { console.log("right") } }
上面就是我們的狀態對象,一共有四個狀態函數,做出不同的操作和實現
具體的使用函數
觸發我們要執行的狀態,state是我要傳遞callback函數參數,我們會根據傳遞的函數進行調用執行它,當然在執行過程當中
我們還可以設定使用其它的抽象類,以達到我們想要的單一原則,不要在乎是不是這樣寫比以前那樣代碼還多了,
確實會多,但是復用的時候你再看看是否還會再那么的繁瑣以及更多的代碼編寫
toggle (state) { state() }代碼組合實現
Title class Menu { constructor(state){ this.num = 1 this.menuStates = { hide:function () { console.log("hide") }, show: function () { console.log("show") }, left: function () { console.log("left") }, right: function () { console.log("right") } } } toggle (state) { state() } } var menu = new Menu() console.log(menu) menu.toggle(menu.menuStates.show) menu.toggle(menu.menuStates.hide)
上面圖片就是我們得到的結果我們會發現menu構造函數是擁有四個狀態函數,我們通過使用toggle函數來調用我們的函數,其實說白了狀態模式相對于其它模式還是比較簡單的,但是對于它的使用場景你要了解,你是否可以真正的運用它,以及把它放在適用的場景上。
狀態模式是指允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。以逗號分割,把這句話分為兩部分來看。第一部分的意思是將狀態封裝成獨立的類,并將請求委托給當前的狀態對象,當對象的內部狀態改變時,會帶來不同的行為變化。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105155.html
摘要:備忘錄模式常常與命令模式和迭代子模式一同使用。自述歷史所謂自述歷史模式實際上就是備忘錄模式的一個變種。在備忘錄模式中,發起人角色負責人角色和備忘錄角色都是獨立的角色。 備忘錄模式(Memento Pattern)屬于行為型模式的一種,在不破壞封裝特性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣就可以將該對象恢復到原先保存的狀態。 概述 備忘錄模式又叫做快照模式(...
摘要:要注意這里的一個狀態行為因為這個詞是狀態模式中最重要的個概念??紤]到這點,聰明的在中推出了狀態機這個偽函數,能夠幫助我們快速實現狀態化。這里就引入了狀態機這個概念,以及和他對應的狀態表。 ?首先聲明一點,這個模式是我目前見過最好用(本人觀點),但是也是最難理解的一個(本人觀點)。 所以大家需要做好心理準備,如果,對這個模式沒有特別強烈的需求,比如: 我有一個Button,我按次數點擊它...
摘要:為了實現這個正義偷笑又合理的訴求,你得先學會今天要介紹的設計模式,因為你們公司的這個流程可能就是用今天這個模式設計的。狀態模式對開閉原則的支持并不太好,新增狀態時,不僅得增加狀態類,還得修改原來已經有的狀態,讓之前的狀態切換到新增的狀態。一、定義你是否經常請(偷)假(懶)?是不是對公司萬惡的請假申請流程深惡痛絕。有沒有想過偷偷改造這個萬惡的系統,從 申請->項目經理審批->部門審批->老板審...
摘要:有限狀態機可以歸納出四個要素現態即當前的狀態。但狀態模式還有一點需要注意到,當采用子類繼承實現多種具體狀態的時候,注意控制狀態的數量,以免出現子類數量膨脹的現象在使用或等更完整面向對象語言時。 業務代碼開發久了,偶爾看看設計模式,總會讓自己有一種清新脫俗的感覺??傁氚堰@種感覺記下來,但一想到要先起個恰如其分的標題和開頭,就讓我有一種百爪撓心的糾結,所以遲遲沒有開始。今天起更新我學習設計...
閱讀 1784·2023-04-25 22:42
閱讀 2215·2021-09-22 15:16
閱讀 3494·2021-08-30 09:44
閱讀 490·2019-08-29 16:44
閱讀 3310·2019-08-29 16:20
閱讀 2518·2019-08-29 16:12
閱讀 3390·2019-08-29 16:07
閱讀 670·2019-08-29 15:08