2018/12/07《大话设计模式》【状态模式】
1:什么是状态模式?
- 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起开像是改了其类。
- 哎~又来了句让人听不明白的定义......
- 看一段代码来理解吧
class A { private $state; public function __construct($state) { $this->state = $state; } public function echo() { if ($this->state == 'A') { echo 'A'; } elseif ($this->state == 'B') { echo 'B'; } elseif (...) { // 其他状态 } else { echo 'xx!'; } } }
- 这里可以说,当 state 的状态改变时候,会改变整个类行为。
- 为了改变这个状况,从而使用状态模式,把每个条件的逻辑移到不同的类中,通过统一的接口定义
2:简单实现一个状态模式
<?php interface State() { public function handle(Context $context); } // 状态A class StateA implements State { public function handle(Context $context) { if ($context->term = 1) { // 处理逻辑,并终止程序 } else { $context.setState(new StateB()); } } } // 状态B class StateB implements State { public function handle(Context $context) { if ($context->term = 2) { // 处理逻辑,并终止程序 } else { $context.setState(new StateC()); } } } // 状态C class StateC implements State { public function handle(Context $context) { // 如果还有其他状态,则继续往下走。如果没有,就在次终止程序 } } // 新的Context类的实现 class Context { private $state;// 用来保存 State 对象 public function setState(State $state) { $this->state = $state; } public function request() { $this->state->handle($this); } }
3:应用场景
- 如果项目中存在太多的 if {...} elseif {...} else {...} 。那么你应该考虑状态模式。我觉得这个是重点考虑对象
- 如果每个状态中处理的业务逻辑特别复杂·那么建议考虑这种方式。
- 如果代码中的状态相对固定。比如一个电商中购买商品的流程:未支付、已过期、待发货(已支付)、已发货、已收货。那么这种状态基本上定下来不会有太大变化,状态发生在内部中,顺序固定,不需要客户端进行处理。
4:参考