1. 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类<br />通过一个状态,修改对象的抽象类,对象包含抽象类的方法,可以根据状态修改引入类,再执行新的引入类的方法,方法中可以调用对象的修改方法,一直循环下去,知道出现最终结果,<br />一般这种状态模式,用if else 也能实现,但是需要很多层,维护困难,<br />将对象的状态变化封装到外部的实现类中去,需要状态经常修改,例如订单,OA,会员,等等<br />比如订单,未支付的时候,传入未支付的类,会执行未支付的下一步动作,已支付的会执行已支付的下一步动作,<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22438777/1635491393887-6b02717a-b7c2-4080-a81d-227f0c069614.png#clientId=uffbbf087-c29c-4&from=paste&height=410&id=ue4f693b8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=410&originWidth=754&originalType=binary&ratio=1&size=48164&status=done&style=none&taskId=u7c7b64b1-c802-4b7a-adfb-4bdf01119ac&width=754)
    1. <?php
    2. //上下文类
    3. class Context
    4. {
    5. private $state;
    6. //修改状态
    7. public function SetState($state)
    8. {
    9. $this->state = $state;
    10. }
    11. //根据状态修改类。执行下一步操作,可以传入本类,交给状态类自己操作修改
    12. public function Request()
    13. {
    14. $this->state = $this->state->Handle();
    15. }
    16. public function show()
    17. {
    18. return $this->state;
    19. }
    20. }
    21. //状态抽象类
    22. interface State
    23. {
    24. public function Handle();
    25. }
    26. class ConcreteStateA implements State
    27. {
    28. //可以传入目标类,执行修改状态,执行下一步操作
    29. public function Handle()
    30. {
    31. echo '当前是A状态,返回B', PHP_EOL;
    32. return new ConcreteStateB();
    33. }
    34. }
    35. class ConcreteStateB implements State
    36. {
    37. public function Handle()
    38. {
    39. echo '当前是B状态,返回A', PHP_EOL;
    40. return new ConcreteStateA();
    41. }
    42. }
    43. $c = new Context();
    44. $stateA = new ConcreteStateA();
    45. $c->SetState($stateA);
    46. var_dump($c->show());
    47. $c->Request();
    48. var_dump($c->show());
    49. $c->Request();
    50. var_dump($c->show());
    51. $c->Request();
    52. var_dump($c->show());
    53. $c->Request();
    54. var_dump($c->show());