JAVAで書かれているものをPHPに書き直し、変数を書き換えたりしてみた。
みんなも好きな百合アニメで試してみよう!
<?php
/*
* PHPによるステートパターンの例
*/
interface State {
public function yuyushiki($stateContext);
}
class Yui implements State {
public function yuyushiki($stateContext) {
print("唯→");
$stateContext->setState(new Yuzuko());
}
}
class Yuzuko implements State {
private $count=0;
public function yuyushiki($stateContext){
print("ゆずこ→");
$stateContext->setState(new Yukari());
}
}
class Yukari implements State {
public function yuyushiki($stateContext){
print("縁→");
$stateContext->setState(new Yui());
}
}
/*
クライアントクラス
ここを通してステートクラスにアクセスする
*/
class StateContext {
//自分の状態をおぼえておく
private $myState;
/*
* コンストラクタ。最初は Yui のオブジェクトを自分の状態として保持する。
*/
public function __construct() {
$this->setState(new Yui());
}
// 通常は、State インタフェースを実装しているクラスによってのみ呼び出される
public function setState($newState) {
$this->myState = $newState;
}
/*
自分で生成したオブジェクト、すなわち初めは Yui のインスタンスからメソッドを実行する
説明しよう。
First Step:
最初に yuyushiki メソッドが実行されると、
$this によって自分自身のインスタンスを渡すので、
Yui に権限を委譲してある setState メソッドを通じ、
StateContext の状態が Yuzuko へと変化するのだ。
Second Step:
二回目に yuyushiki メソッドが実行されると、
こんどは Yui クラスではなく、 Yuzuko クラスに自分のインスタンスが渡される。
そのため、 Yuzuko に権限を委譲していた setState メソッドが実行され、
StateContext の状態は Yukari へと変化させられる。
Third Step:
三回目に yuyushiki メソッドが実行されると、
そのため、 Yukari に権限を委譲していた setState メソッドが実行され、
StateContext の状態は Yui へと変化させられる。
*/
public function yuyushiki() {
$this->myState->yuyushiki($this);
}
}
/*
*
* 実際に実行してみる
*
*/
$sc = new StateContext();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
$sc->yuyushiki();
実行結果
唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→