复制代码代码如下:
/**
* 状態パターン
*
* 内部状態が変化したときにオブジェクトの動作を変更できるようにし、オブジェクトが属するクラスを変更しているように見せます
*
*/
インターフェース状態
{
パブリック関数ハンドル($state);
パブリック関数 display();
}
クラスコンテキスト
{
private $_state = null;
パブリック関数 __construct($state)
{
$this->setState($state);
}
パブリック関数 setState($state)
{
$this->_state = $state;
}
パブリック関数 request()
{
$this->_state->display();
$this->_state->handle($this);
}
}
クラス StateA は State を実装します
{
public function handle($context)
{
$context->setState(new StateB());
}
public function display()
{
echo "state A
";
}
}
クラス StateB は State を実装します
{
public function handle($context)
{
$context->setState(new StateC());
}
public function display()
{
echo "state B
";
}
}
クラス StateC は State を実装します
{
public function handle($context)
{
$context->setState(new StateA());
}
public function display()
{
echo "state C
";
}
}
// 实例化一下
$objContext = new Context(new StateB());
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();