ここでは、デザインパターンの1つである Template Method パターンについて PHP とスーパーファミコンを使って理解する入門用の解説を掲載しています。
Template Method パターンとは
大まかな処理フローをスーパークラスで規定し、その詳細については サブクラスで実装するパターンである
スポンサーリンク
PHP5 での Template Method パターン実装例
我が家では 2013 年くらいまでは、現役バリバリの主力ゲーム機であったスーパーファミコンを例にサンプルコードを示していきます。
スーパーファミコンでは、ゲーム開始処理はカセットをセットし、電源を入れるとそれぞれのゲームが開始します。まずは、このイメージを頭に思い浮かべてソースコードを確認してください。
※ なお、ここで示すサンプルコードと実物のスーパーファミコンの動作は異なります(念のため)
// スーパーファミコンクラス(親クラス)
abstract class Sfc
{
protected $_title;
// 電源投入(ゲームスタート)
public function powerOn()
{
// ゲームタイトルを取得
$this->_title = $this->_getTitle();
// ゲーム開始
$this->_play();
}
abstract protected function _getTitle();
abstract protected function _play();
}
// ドラゴンクエスト6クラス(子クラス)
class DoragonQuest6 extends Sfc
{
protected function _getTitle()
{
return 'ドラゴンクエスト6' ;
}
protected function _play()
{
/*
* ドラゴンクエスト開始
*/
}
}
// スーパーマリオクラス(子クラス)
class SuperMario extends Sfc
{
protected function _getTitle()
{
return 'スーパーマリオブラザーズ' ;
}
protected function _play()
{
/*
* スーパーマリオ開始
*/
}
}
// ドラゴンクエスト6をプレイする場合
$dq6 = new DoragonQuest6();
$dq6->powerOn();
// スーパーマリオをプレイする場合
$sm = new SuperMario();
$sm->powerOn();
上記では、電源投入メソッドがコールされると、抽象メソッドである _getTitle および _play メソッドをコールしています。
この処理は全てのゲームで共通なため親クラスでその処理フローを powerOn メソッドで記述しています。しかし、タイトルや実際の処理は個々のゲームによって異なるため、それぞれのサブクラスで、個別の処理を記述していることがわかります。
このように、共通な処理やフローが記述されたテンプレートとなる親クラスと、個別の処理を記述する子クラスを作成するパターンを Tempalte Method パターンと呼びます。
オブジェクト指向の「継承」を利用したパターンであり、オブジェクト指向言語によるプログラミングを行う場合は必須の知識です。
まあ、継承なんて必須の知識ではないと言う方もいるにはいますが。。。
参考