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