国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

設(shè)計(jì)模式手冊(cè)之狀態(tài)模式

call_me_R / 2858人閱讀

摘要:什么是狀態(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)

3. 代碼實(shí)現(xiàn) 3.1 ES6 實(shí)現(xiàn)

在JavaScript中,可以直接用JSON對(duì)象來(lái)代替狀態(tài)類(lèi)。

下面代碼展示的就是FSM(有限狀態(tài)機(jī))里面有3種狀態(tài):downloadpausedeleted
控制狀態(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

相關(guān)文章

  • 設(shè)計(jì)模式手冊(cè)狀態(tài)模式

    摘要:什么是狀態(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地址 博...

    Faremax 評(píng)論0 收藏0
  • 前端每周清單第 51 期: React Context API 與模式變遷, Webpack 與 W

    摘要:前端每周清單第期與模式變遷與優(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...

    Jiavan 評(píng)論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強(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...

    XiNGRZ 評(píng)論0 收藏0
  • 「碼個(gè)蛋」2017年200篇精選干貨集合

    摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類(lèi)別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...

    wangtdgoodluck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<