1、上下文环境类,它是状态的拥有者。同时它把行为委托给具体的状态类去执行。
2、抽象状态接口,统一接口,所有状态都要实现此接口。
3、具体状态类,负责不同状态的实现。
/** *环境类 */ class Context{ public $stateFlag; private $state; public function setState(State $state){ $this->state = $state; } public function request(){ $this->state && $this->state->handle($this); } } /** *抽象状态类 */ abstract class State{ public abstract function handle(Context $context); } /** *状态A */ class ConcreteStateA extends State{ public function handle(Context $context){ if(1 == $context->stateFlag){ echo 'State flag is 1, so do stateA action<br>'; }else{ $stateB = new ConcreteStateB(); $context->setState($stateB); $context->request(); } } } /** *状态B */ class ConcreteStateB extends State{ public function handle(Context $context){ if(2 == $context->stateFlag){ echo 'State flag is 2, so do stateB action<br>'; } } } $context = new Context(); $context->stateFlag = 1; $stateA = new ConcreteStateA(); $context->setState($stateA); $context->request(); $context->stateFlag = 2; $context->request();状态模式可以将复杂的if-else判断分解到一个个类中去,比如上面的例子,如果用if else就相当于
$flag = 1;
if($flag == 1){
....
}else if($flag == 2){
....
}