设想形式手册之状况形式

1. 什么是“状况形式”?

状况形式:对象行动是
基于状况来转变的。

内部的状况转化,致使了行动表现形式差别。
所以,用户在表面看起来,彷佛是修改了行动。

Webpack4系列教程(17篇) + 设想形式手册(16篇)GitHub地点

博客主题引荐Theme Art Design,“笔记纪录+搭建学问系统”的利器。

原文地点: 设想形式手册之状况形式

2. 优瑕玷

长处

封装了转化划定规矩,关于大批分支语句,能够斟酌运用状况类进一步封装。
每一个状况都是肯定的,所以对象行动是可控的。

瑕玷

状况形式的症结是将事物的状况都封装成零丁的类,这个类的种种要领就是“此种状况对应的表现行动”。
因而,状况类会增添顺序开支

3. 代码完成

3.1 ES6 完成

在JavaScript中,能够直接用JSON对象来替代状况类。

下面代码展现的就是FSM(有限状况机)内里有3种状况:downloadpausedeleted
掌握状况转化的代码也在个中。

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. 参考

    原文作者:心谭
    原文地址: https://segmentfault.com/a/1190000018459019
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞