上記記事の「JAVAによる例」をコピペし、PHPで動作するように書き換えてみました。
ただ読んだだけではわからないので、とりあえず今後いじって理解するためのテンプレと思って作りました。
<?php
/*
* PHPによるステートパターンの例
*
*/
interface State {
public function writeName($stateContext, $name);
}
class StateA implements State {
public function writeName($stateContext, $name) {
print(strtolower($name));
$stateContext->setState(new StateB());
}
}
class StateB implements State {
private $count=0;
public function writeName($stateContext, $name){
print(strtoupper($name));
// StateBのwriteName()が2度呼び出された後に状態を変化させる
if(++$this->count>1) {
$stateContext->setState(new StateA());
}
}
}
class StateContext {
private $myState;
public function __construct() {
$this->setState(new StateA());
}
// 通常は、Stateインタフェースを実装しているクラスによってのみ呼び出される
public function setState($newState) {
$this->myState = $newState;
}
public function writeName($name) {
$this->myState->writeName($this, $name);
}
}
/*
*
* 実際に実行してみる
*
*/
$sc = new StateContext();
$sc->writeName("<p>Monday</p>");
$sc->writeName("<p>Tuesday</p>");
$sc->writeName("<p>Wednesday</p>");
$sc->writeName("<p>Thursday</p>");
$sc->writeName("<p>Saturday</p>");
$sc->writeName("<p>Sunday</p>");