成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設計模式手冊之狀態(tài)模式

call_me_R / 2881人閱讀

摘要:什么是狀態(tài)模式狀態(tài)模式對象行為是基于狀態(tài)來改變的。原文地址設計模式手冊之狀態(tài)模式優(yōu)缺點優(yōu)點封裝了轉化規(guī)則,對于大量分支語句,可以考慮使用狀態(tài)類進一步封裝。

1. 什么是“狀態(tài)模式”?
狀態(tài)模式:對象行為是基于狀態(tài)來改變的。

內部的狀態(tài)轉化,導致了行為表現形式不同。
所以,用戶在外面看起來,好像是修改了行為。

Webpack4系列教程(17篇) + 設計模式手冊(16篇):GitHub地址

博客主題推薦:Theme Art Design,“筆記記錄+搭建知識體系”的利器。

原文地址: 設計模式手冊之狀態(tài)模式

2. 優(yōu)缺點

優(yōu)點

封裝了轉化規(guī)則,對于大量分支語句,可以考慮使用狀態(tài)類進一步封裝。
每個狀態(tài)都是確定的,所以對象行為是可控的。

缺點

狀態(tài)模式的關鍵是將事物的狀態(tài)都封裝成多帶帶的類,這個類的各種方法就是“此種狀態(tài)對應的表現行為”。
因此,狀態(tài)類會增加程序開銷。

3. 代碼實現 3.1 ES6 實現

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

下面代碼展示的就是FSM(有限狀態(tài)機)里面有3種狀態(tài):downloadpause、deleted。
控制狀態(tài)轉化的代碼也在其中。

DownLoad類就是,常說的Context對象,它的行為會隨著狀態(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("刪除任務");
        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(); // 繼續(xù)下載
download.hanldeDel(); // 下載中,無法執(zhí)行刪除操作
download.handleClick(); // 暫停下載
download.hanldeDel(); // 刪除任務
3.2 Python3 實現

python的代碼采用的是“面向對象”的編程,沒有過度使用函數式的閉包寫法(python寫起來也不難)。

因此,負責狀態(tài)轉化的類,專門拿出來多帶帶封裝。
其他3個狀態(tài)類的狀態(tài),均由這個狀態(tài)類來管理。

# 負責狀態(tài)轉化
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

# 以下是三個狀態(tà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("刪除任務")
    self.__transfomer.change("deleted")

class DeletedState:
  def __init__(self, transfomer):
    self.__state = "deleted"
    self.__transfomer = transfomer
  
  def click(self):
    print("任務已刪除, 請重新開始")

  def delete(self):
    print("任務已刪除")

# 業(yè)務代碼
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(); # 下載中,無法執(zhí)行刪除操作
  download.handle_click(); # 暫停下載
  download.handle_del(); # 刪除任務
4. 參考

23種設計模式全解析

菜鳥教程狀態(tài)模式

《JavaScript設計模式與開發(fā)實踐》

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/109091.html

相關文章

  • 設計模式手冊狀態(tài)模式

    摘要:什么是狀態(tài)模式狀態(tài)模式對象行為是基于狀態(tài)來改變的。原文地址設計模式手冊之狀態(tài)模式優(yōu)缺點優(yōu)點封裝了轉化規(guī)則,對于大量分支語句,可以考慮使用狀態(tài)類進一步封裝。 1. 什么是狀態(tài)模式? 狀態(tài)模式:對象行為是基于狀態(tài)來改變的。 內部的狀態(tài)轉化,導致了行為表現形式不同。所以,用戶在外面看起來,好像是修改了行為。 Webpack4系列教程(17篇) + 設計模式手冊(16篇):GitHub地址 博...

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

    摘要:前端每周清單第期與模式變遷與優(yōu)化界面生成作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000013279448); 前端每周清單第 51 期: React Context A...

    Jiavan 評論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強大的表單驗證前端掘金支持非常強大的內置表單驗證,以及。面向對象和面向過程的區(qū)別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內置表單驗證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評論0 收藏0
  • 「碼個蛋」2017年200篇精選干貨集合

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

    wangtdgoodluck 評論0 收藏0

發(fā)表評論

0條評論

call_me_R

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<