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