允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类<br />通过一个状态,修改对象的抽象类,对象包含抽象类的方法,可以根据状态修改引入类,再执行新的引入类的方法,方法中可以调用对象的修改方法,一直循环下去,知道出现最终结果,<br />一般这种状态模式,用if else 也能实现,但是需要很多层,维护困难,<br />将对象的状态变化封装到外部的实现类中去,需要状态经常修改,例如订单,OA,会员,等等<br />比如订单,未支付的时候,传入未支付的类,会执行未支付的下一步动作,已支付的会执行已支付的下一步动作,<br />
<?php//上下文类class Context{ private $state; //修改状态 public function SetState($state) { $this->state = $state; } //根据状态修改类。执行下一步操作,可以传入本类,交给状态类自己操作修改 public function Request() { $this->state = $this->state->Handle(); } public function show() { return $this->state; }}//状态抽象类interface State{ public function Handle();}class ConcreteStateA implements State{ //可以传入目标类,执行修改状态,执行下一步操作 public function Handle() { echo '当前是A状态,返回B', PHP_EOL; return new ConcreteStateB(); }}class ConcreteStateB implements State{ public function Handle() { echo '当前是B状态,返回A', PHP_EOL; return new ConcreteStateA(); }}$c = new Context();$stateA = new ConcreteStateA();$c->SetState($stateA);var_dump($c->show());$c->Request();var_dump($c->show());$c->Request();var_dump($c->show());$c->Request();var_dump($c->show());$c->Request();var_dump($c->show());