<?php
/**
* 3.4 状态模式
* 定义:
* 当一个对象的内在状态改变时允许改变其行为,这个对象看
* 起来像是改变了其类。
* 角色:
* 1. 抽象状态类
* 职责:定义一个接口以封装与Context的一个特定状态
* 相关的行为。
* 2. 具体状态类
* 职责:每一个具体的状态类实现一个与Context的一个
* 状态相关的行为。
* 3. Context类
* 职责:维护一个具体状态类的实例,这个实例定义当前
* 的状态。
* 优点:
* 1. 将与特定状态相关的行为局部化,并且将不同状态的行
* 为分隔开来。
* 缺点:
* 1. 会增加类和对象的个数;
* 2. 此模式的机构和实现都比较复杂,如果使用不当将导致
* 程序结构和代码的混乱。
* 使用场景:
* 1. 如果一个对象的行为取决于它的状态,并且它必须在
* 运行时,时刻根据状态改变它的行为。
* 2. 一个操作中含有庞大的多分支条件语句,且这些分支
* 依赖于该对象的状态。
*/
header('content-type:text/html;charset=utf8');
//抽象状态类
abstract class State{
abstract public function handle(Context $context);
}
//具体状态类
class ConcreteStateA extends State{
public function handle(Context $context){
$context->setState(new ConcreteStateB());
}
}
class ConcreteStateB extends State{
public function handle(Context $context){
$context->setState(new ConcreteStateC());
}
}
class ConcreteStateC extends State{
public function handle(Context $context){
$context->setState(new ConcreteStateA());
}
}
//Context类
class Context{
private $state;
public function __construct(State $state){
$this->state=$state;
}
public function setState($state){
$this->state=$state;
echo '当前状态:'.get_class($this->state);
}
public function getState(){
return $this->state;
}
public function request(){
$this->state->handle($this);
}
}
//客户端
$context1=new Context(new ConcreteStateB());
$context1->request();
转载于:https://blog.51cto.com/noican/1614786