GOFデザインパターン Template Method編 GOF本分類:振る舞い+クラス
最近PHP5でデザインパターンのお勉強をしています。
忘れないようにメモ書き程度で書いていきます。
Template Method
GOF本での定義は
1つのオペレーションにアルゴリズムのスケルトンを定義しておき、 その中のいくつかのステップについては、サブクラスでの定義に任せる ことにする。Template Methodパターンでは、アルゴリズムの構造を変えずに アルゴリズム中のあるステップをサブクラスで定義する。
う〜ん、小難しく書いてますね。
では、実際のコードで見ていきましょう。
クライアントコードは
client.php <?php require_one 'HogeDisplay.class.php'; require_one 'BarDisplay.class.php'; $display1 = new HogeDisplay(); $display2 = new BarDisplay(); $display1->hoge(); $display1->display(); $display2->hoge(); $display2->display(); ?>
これを実行すると
〜〜〜〜〜〜
hoge
〜〜〜〜〜〜
bar
クライアントからみると オブジェクトdisplay1 とdisplay2があり、それぞれ同じ名前のhogeメソッドとdisplayメソッドがある。
hogeメソッドの出力は同じ
displayメソッドでびみょ〜に違う処理ができる。
HogeDisplay.class.php <?php class HogeDisplay extends AbstractDisplay{ public function display(){echo "hoge";} } ?>
HogeDisplay.class.phpは、AbstractDisplayを継承したクラス。
display関数で単純に、echoしてるだけ。
BarDisplay.class.php <?php class DisplayHage extends AbstractDisplay{ public function display(){echo "bar";} } ?>
BarDisplay.class.phpは、AbstractDisplayを継承したクラス。
display関数で単純に、echoしてるだけ。
AbstractDisplay.class.php <?php abstract class AbstractDisplay{ //共通する処理を記述 private $data; public function hoge(){echo "〜〜〜〜〜〜";} //ここでサブクラスで実装させたい内容を記述 abstract function display(); } ?>
AbstractDisplay.class.phpは、抽象クラス。
ここで定義されている、
・hogeメソッドは、実装されている。
・displayメソッドは、抽象メソッド。子クラスで必ず実装しなければならない。(子クラスで自由にして!)
まとめ
入門本に書かれている、継承の説明そのままっぽいですね。よく、ポリモーフィズムなんて呼ばれるやつです。
大体同じ処理内容で、一部分だけ違う処理を実装したいときに使うパターンです。
関連パターン
・Factory Methodパターン
・Strategyパターン
参考文書
・PHPによるデザインパターン入門 著:下岡秀幸、畑勝也、道端良
・オブジェクト指向における再利用のためのデザインパターン 著Erich Gamma、Richard Helm、Ralph Johason、John Vlissides