/**
* 状态模式
* 允许一个实例在内部修改状态行为
*
*/
/**
* Class state
* 状态类 抽象
*/
abstract class AState
{
abstract function handle(Context $context);
}
/**
* Class StateA
* 抽象状态实例A
*/
class StateA extends AState
{
// 保存自身实例
private static $_examples;
private function __construct()
{
// echo '实例自动构造函数A' . PHP_EOL;
}
private function __clone()
{
// echo '实例自动析构函数A' . PHP_EOL;
// TODO: Implement __clone() method.
}
public static function Examples()
{
// 获取自身实例
if (!isset(self::$_examples)) {
self::$_examples = new self;
}
return self::$_examples;
}
function Handle(Context $context)
{
// TODO: Implement handle() method.
echo 'stateA' . PHP_EOL;
$context->ChangeState(StateB::Examples());
}
}
/**
* Class StateB
* 抽象状态B
*/
class StateB extends AState
{
// 保存自身实例
private static $_examples;
private function __construct()
{
// echo '实例自动构造函数B' . PHP_EOL;
}
private function __clone()
{
// echo '实例自动析构函数B' . PHP_EOL;
// TODO: Implement __clone() method.
}
public static function Examples()
{
// 获取自身实例
if (!isset(self::$_examples)) {
self::$_examples = new self;
}
return self::$_examples;
}
// Handle 状态实例转跳
function Handle(Context $context)
{
// TODO: Implement handle() method.
echo 'stateB' . PHP_EOL;
$context->ChangeState(StateA::Examples());
}
}
/**
* Class context
* 上下文,环境内容
* 状态保存类
*/
class Context
{
protected $state;
public function __construct(AState $AState)
{
// 初始状态 保存
$this->state = $AState;
}
// 修改状态
public function ChangeState(AState $AState)
{
$this->state = $AState;
}
public function Handle()
{
// 调用保存实例的Handle
$this->state->Handle($this);
}
public function Request()
{
$this->state->Handle($this);
}
}
$context = new Context(StateB::Examples());
$context->Request(); // stateB
$context->Request(); // stateA
$context->Request(); // stateB