LoginSignup
2
2

More than 5 years have passed since last update.

PHPステートパターンによるゆゆ式の実装

Posted at

ソースはWikipedia: State パターン

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();

実行結果

唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2