第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > php状态 PHP 状态模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

php状态 PHP 状态模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

时间:2021-02-24 11:25:46

相关推荐

php状态 PHP 状态模式  - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

/**

* 状态模式

* 允许一个实例在内部修改状态行为

*

*/

/**

* 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。