摘要:什么是狀態(tài)模式狀態(tài)模式對(duì)象行為是基于狀態(tài)來(lái)改變的。原文地址設(shè)計(jì)模式手冊(cè)之狀態(tài)模式優(yōu)缺點(diǎn)優(yōu)點(diǎn)封裝了轉(zhuǎn)化規(guī)則,對(duì)于大量分支語(yǔ)句,可以考慮使用狀態(tài)類(lèi)進(jìn)一步封裝。
1. 什么是“狀態(tài)模式”?
狀態(tài)模式:對(duì)象行為是基于狀態(tài)來(lái)改變的。
內(nèi)部的狀態(tài)轉(zhuǎn)化,導(dǎo)致了行為表現(xiàn)形式不同。
所以,用戶在外面看起來(lái),好像是修改了行為。
Webpack4系列教程(17篇) + 設(shè)計(jì)模式手冊(cè)(16篇):GitHub地址
博客主題推薦:Theme Art Design,“筆記記錄+搭建知識(shí)體系”的利器。
原文地址: 設(shè)計(jì)模式手冊(cè)之狀態(tài)模式
2. 優(yōu)缺點(diǎn)優(yōu)點(diǎn)
封裝了轉(zhuǎn)化規(guī)則,對(duì)于大量分支語(yǔ)句,可以考慮使用狀態(tài)類(lèi)進(jìn)一步封裝。
每個(gè)狀態(tài)都是確定的,所以對(duì)象行為是可控的。
缺點(diǎn)
狀態(tài)模式的關(guān)鍵是將事物的狀態(tài)都封裝成多帶帶的類(lèi),這個(gè)類(lèi)的各種方法就是“此種狀態(tài)對(duì)應(yīng)的表現(xiàn)行為”。
因此,狀態(tài)類(lèi)會(huì)增加程序開(kāi)銷(xiāo)。
在JavaScript中,可以直接用JSON對(duì)象來(lái)代替狀態(tài)類(lèi)。
下面代碼展示的就是FSM(有限狀態(tài)機(jī))里面有3種狀態(tài):download、pause、deleted。
控制狀態(tài)轉(zhuǎn)化的代碼也在其中。
DownLoad類(lèi)就是,常說(shuō)的Context對(duì)象,它的行為會(huì)隨著狀態(tài)的改變而改變。
const FSM = (() => { let currenState = "download"; return { download: { click: () => { console.log("暫停下載"); currenState = "pause"; }, del: () => { console.log("先暫停, 再刪除"); } }, pause: { click: () => { console.log("繼續(xù)下載"); currenState = "download"; }, del: () => { console.log("刪除任務(wù)"); currenState = "deleted"; } }, deleted: { click: () => { console.log("任務(wù)已刪除, 請(qǐng)重新開(kāi)始"); }, del: () => { console.log("任務(wù)已刪除"); } }, 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(); } } // 開(kāi)始下載 let download = new Download(FSM); download.handleClick(); // 暫停下載 download.handleClick(); // 繼續(xù)下載 download.hanldeDel(); // 下載中,無(wú)法執(zhí)行刪除操作 download.handleClick(); // 暫停下載 download.hanldeDel(); // 刪除任務(wù)3.2 Python3 實(shí)現(xiàn)
python的代碼采用的是“面向?qū)ο蟆钡木幊蹋瑳](méi)有過(guò)度使用函數(shù)式的閉包寫(xiě)法(python寫(xiě)起來(lái)也不難)。
因此,負(fù)責(zé)狀態(tài)轉(zhuǎn)化的類(lèi),專(zhuān)門(mén)拿出來(lái)多帶帶封裝。
其他3個(gè)狀態(tài)類(lèi)的狀態(tài),均由這個(gè)狀態(tài)類(lèi)來(lái)管理。
# 負(fù)責(zé)狀態(tài)轉(zhuǎn)化 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 # 以下是三個(gè)狀態(tài)類(lèi) 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("繼續(xù)下載") self.__transfomer.change("download") def delete(self): print("刪除任務(wù)") self.__transfomer.change("deleted") class DeletedState: def __init__(self, transfomer): self.__state = "deleted" self.__transfomer = transfomer def click(self): print("任務(wù)已刪除, 請(qǐng)重新開(kāi)始") def delete(self): print("任務(wù)已刪除") # 業(yè)務(wù)代碼 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(); # 繼續(xù)下載 download.handle_del(); # 下載中,無(wú)法執(zhí)行刪除操作 download.handle_click(); # 暫停下載 download.handle_del(); # 刪除任務(wù)4. 參考
23種設(shè)計(jì)模式全解析
菜鳥(niǎo)教程狀態(tài)模式
《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109091.html
摘要:什么是狀態(tài)模式狀態(tài)模式對(duì)象行為是基于狀態(tài)來(lái)改變的。原文地址設(shè)計(jì)模式手冊(cè)之狀態(tài)模式優(yōu)缺點(diǎn)優(yōu)點(diǎn)封裝了轉(zhuǎn)化規(guī)則,對(duì)于大量分支語(yǔ)句,可以考慮使用狀態(tài)類(lèi)進(jìn)一步封裝。 1. 什么是狀態(tài)模式? 狀態(tài)模式:對(duì)象行為是基于狀態(tài)來(lái)改變的。 內(nèi)部的狀態(tài)轉(zhuǎn)化,導(dǎo)致了行為表現(xiàn)形式不同。所以,用戶在外面看起來(lái),好像是修改了行為。 Webpack4系列教程(17篇) + 設(shè)計(jì)模式手冊(cè)(16篇):GitHub地址 博...
摘要:前端每周清單第期與模式變遷與優(yōu)化界面生成作者王下邀月熊編輯徐川前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000013279448); 前端每周清單第 51 期: React Context A...
摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類(lèi)總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類(lèi)別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
閱讀 702·2021-09-29 09:34
閱讀 2554·2019-08-30 15:53
閱讀 3361·2019-08-29 17:17
閱讀 761·2019-08-29 16:08
閱讀 1120·2019-08-29 13:03
閱讀 951·2019-08-27 10:54
閱讀 688·2019-08-26 13:39
閱讀 2859·2019-08-26 13:34