摘要:什么是狀態模式狀態模式對象行為是基于狀態來改變的。原文地址設計模式手冊之狀態模式優缺點優點封裝了轉化規則,對于大量分支語句,可以考慮使用狀態類進一步封裝。
1. 什么是“狀態模式”?
狀態模式:對象行為是基于狀態來改變的。
內部的狀態轉化,導致了行為表現形式不同。
所以,用戶在外面看起來,好像是修改了行為。
Webpack4系列教程(17篇) + 設計模式手冊(16篇):GitHub地址
博客主題推薦:Theme Art Design,“筆記記錄+搭建知識體系”的利器。
原文地址: 設計模式手冊之狀態模式
2. 優缺點優點
封裝了轉化規則,對于大量分支語句,可以考慮使用狀態類進一步封裝。
每個狀態都是確定的,所以對象行為是可控的。
缺點
狀態模式的關鍵是將事物的狀態都封裝成多帶帶的類,這個類的各種方法就是“此種狀態對應的表現行為”。
因此,狀態類會增加程序開銷。
在JavaScript中,可以直接用JSON對象來代替狀態類。
下面代碼展示的就是FSM(有限狀態機)里面有3種狀態:download、pause、deleted。
控制狀態轉化的代碼也在其中。
DownLoad類就是,常說的Context對象,它的行為會隨著狀態的改變而改變。
const FSM = (() => { let currenState = "download"; return { download: { click: () => { console.log("暫停下載"); currenState = "pause"; }, del: () => { console.log("先暫停, 再刪除"); } }, pause: { click: () => { console.log("繼續下載"); currenState = "download"; }, del: () => { console.log("刪除任務"); currenState = "deleted"; } }, deleted: { click: () => { console.log("任務已刪除, 請重新開始"); }, del: () => { console.log("任務已刪除"); } }, getState: () => currenState }; })(); class Download { constructor(fsm) { this.fsm = fsm; } handleClick() { const { fsm } = this; fsm[fsm.getState()].click(); } hanldeDel() { const { fsm } = this; fsm[fsm.getState()].del(); } } // 開始下載 let download = new Download(FSM); download.handleClick(); // 暫停下載 download.handleClick(); // 繼續下載 download.hanldeDel(); // 下載中,無法執行刪除操作 download.handleClick(); // 暫停下載 download.hanldeDel(); // 刪除任務3.2 Python3 實現
python的代碼采用的是“面向對象”的編程,沒有過度使用函數式的閉包寫法(python寫起來也不難)。
因此,負責狀態轉化的類,專門拿出來多帶帶封裝。
其他3個狀態類的狀態,均由這個狀態類來管理。
# 負責狀態轉化 class StateTransform: def __init__(self): self.__state = "download" self.__states = ["download", "pause", "deleted"] def change(self, to_state): if (not to_state) or (to_state not in self.__states) : raise Exception("state is unvalid") self.__state = to_state def get_state(self): return self.__state # 以下是三個狀態類 class DownloadState: def __init__(self, transfomer): self.__state = "download" self.__transfomer = transfomer def click(self): print("暫停下載") self.__transfomer.change("pause") def delete(self): print("先暫停, 再刪除") class PauseState: def __init__(self, transfomer): self.__state = "pause" self.__transfomer = transfomer def click(self): print("繼續下載") self.__transfomer.change("download") def delete(self): print("刪除任務") self.__transfomer.change("deleted") class DeletedState: def __init__(self, transfomer): self.__state = "deleted" self.__transfomer = transfomer def click(self): print("任務已刪除, 請重新開始") def delete(self): print("任務已刪除") # 業務代碼 class Download: def __init__(self): self.state_transformer = StateTransform() self.state_map = { "download": DownloadState(self.state_transformer), "pause": PauseState(self.state_transformer), "deleted": DeletedState(self.state_transformer) } def handle_click(self): state = self.state_transformer.get_state() self.state_map[state].click() def handle_del(self): state = self.state_transformer.get_state() self.state_map[state].delete() if __name__ == "__main__": download = Download() download.handle_click(); # 暫停下載 download.handle_click(); # 繼續下載 download.handle_del(); # 下載中,無法執行刪除操作 download.handle_click(); # 暫停下載 download.handle_del(); # 刪除任務4. 參考
23種設計模式全解析
菜鳥教程狀態模式
《JavaScript設計模式與開發實踐》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43338.html
摘要:什么是狀態模式狀態模式對象行為是基于狀態來改變的。原文地址設計模式手冊之狀態模式優缺點優點封裝了轉化規則,對于大量分支語句,可以考慮使用狀態類進一步封裝。 1. 什么是狀態模式? 狀態模式:對象行為是基于狀態來改變的。 內部的狀態轉化,導致了行為表現形式不同。所以,用戶在外面看起來,好像是修改了行為。 Webpack4系列教程(17篇) + 設計模式手冊(16篇):GitHub地址 博...
摘要:前端每周清單第期與模式變遷與優化界面生成作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000013279448); 前端每周清單第 51 期: React Context A...
摘要:強大的表單驗證前端掘金支持非常強大的內置表單驗證,以及。面向對象和面向過程的區別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內置表單驗證,maxlength、minlength、required 以及 patt...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
閱讀 2883·2021-11-24 09:39
閱讀 2455·2019-08-30 15:53
閱讀 3025·2019-08-30 13:47
閱讀 1296·2019-08-30 12:50
閱讀 1481·2019-08-29 16:31
閱讀 2642·2019-08-29 13:14
閱讀 1559·2019-08-29 10:55
閱讀 790·2019-08-26 13:32