- 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类<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());