状态模式

136 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

导言

我们先来回顾下到本篇状态模式为止,学过了哪些行为型设计模式:观察者模式、模板模式、策略模式和职责链模式。

观察者模式,也叫发布-订阅模式,执行操作会依赖于另一对象的状态,当收到对象状态变化的通知后,会进行对应的执行;模板模式是一种基于继承的设计模式,父类用于提取子类公共方法;策略模式是根据不同的条件,也可以叫状态吧,来定义出一系列可能被执行的策略;还有上篇说的职责链模式,在请求的发送和接收过程中,可以有多个对象参与其中行使不同的职责,形成一条职责链。

状态模式,不同的状态对应不同的行为,也就是说,在程序执行过程中,会根据不同的状态来执行该状态对应的行为。这个其实和策略模式好像是非常相似的,都是不同的状态对应不同的行为。但两者有什么区别呢?

状态模式和策略模式

严格来说,两者还是有区别的。优化if-else结构,策略模式和状态模式,哪个更合理呢?我想应该是策略模式。策略模式的每种策略应该是独立的,而状态模式的各种状态似乎都存在某些关联,并且是同一个对象下的不同状态。

举个例子:下载文件,我们定义三种状态:开始下载,下载中和下载完成。那我们更适合用哪个模式呢?如果你非要用策略模式,也未尝不可,只是状态模式可能更贴切点。

let downloadFile = {
  beginStatus: function () {
    // TODO
    console.log('begin...')
  },
  downloadingStatus: function () {
    // TODO
    console.log('downloading...')
  },
  finishStatus: function () {
    // TODO
    console.log('finish...')
  }
}
downloadFile.downloadingStatus() // downloading...

同一对象内的不同状态用状态模式,它们间可能是有关联的,像是否开始,是否正在进行中和是否结束,都属于下载文件这个对象本身,并且它们是受下载进度同一指标影响的,现在就三种状态,可能还会对下载进度是多少进行细分状态,这样就可以直接添加对应的状态函数,这也符合单一职责原则。