理解设计模式(二十)——状态模式

状态模式

提出问题

一个对象存在着不同的状态,不同的状态下对象的行为会有所不同(就是说函数执行的内容不同)。例如一个账户有余额为正、余额为0这两种状态。余额为正时可以取钱,余额为0时不能取钱。那么正常情况下,我们可能会设计一个取钱函数,在函数里对于账户的余额进行if判断,执行相应的操作。那么我们又要来思考这个老生常谈的问题了,万一要发生变化呢?

例如,我现在再增加一个透支的状态,透支额度小于2000也可以取钱,只是要收手续费。我们要在取钱函数里加一个判断条件吗?这违反了设计模式的开闭原则。该怎么解决这个问题呢?

解决问题

还是老一套,封装。把要变化的东西封装起来。这里取钱函数可能会发生变化,那么我们就把不同状态下的取钱函数封装成一个状态对象的方法(其实你直接封装成几个函数也行,就是把不同状态下不同的行为拆分到不同的地方就行,只要你能调用就行)。

下面还是直接上代码:

// 封装成几个函数
// 这是正常的取钱
function normalWithdraw(value) {
// ...
}

// 透支情况下取钱
function negativeWithdraw(value) {
// ...
}

class Account {
constructor(balance) {
this.balance = balance;
}

setStatus(withdrawFunction) {
this.withdrawFunction = withdrawFunction;
}

withdraw(value) {
this.widthdrawFunction(value);
}
}

let account = new Account(100);
account.setStatus(normalWithdraw);
account.withdraw(100);
Author: LeoB_O
Link: https://leob-o.github.io/2019/06/18/StatePattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.