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