PHPでデザインパターン「Template Methodパターン」
GoFデザインパターンをPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。
Template Methodパターンとは
テンプレートの機能を持つパターンです。スーパークラスでテンプレートの元となるメソッドが定義し、サブクラスでそのメソッドの具体的な処理を実装します。
Template Methodパターンの構造
- Abstractionクラス テンプレートメソッドを実装し、そのテンプレートメソッドで使用しているメソッドを抽象メソッドで定義します。
- Concreteクラス Abstractionクラスを継承し、抽象メソッドを実装します。
Abstractionクラスでは、抽象メソッドを定義し、その抽象メソッドを使用して処理するテンプレートメソッドを用意します。抽象メソッドは、Concreteクラスで実装します。
Template Methodパターンのメリット
- ロジックを共通化できる
Template Methodパターンの実装例
htmlを出力する機能を実装します。
Abstractionクラスに相当するHtmlAbstractクラスです。htmlを構成するheader、body、footerを生成する処理を抽象メソッドで定義し、renderメソッドでは各抽象メソッドを組み合わせてhtmlを生成する処理を実装しています。renderメソッドがテンプレートメソッドにあたります。
<?php namespace DesignPatterns\Behavioral\TemplateMethod; abstract class HtmlAbstract { abstract protected function getHeader(); abstract protected function getBody($text); abstract protected function getFooter(); final public function render($text) { $html = $this->getHeader(); $html .= $this->getBody($text); $html .= $this->getFooter(); return $html; } }
Concreteクラスに相当するHtmlクラスです。HtmlAbstractクラスで定義した抽象メソッドを実装しています。
<?php namespace DesignPatterns\Behavioral\TemplateMethod; class Html extends HtmlAbstract { public function getHeader() { return '<html><head></head><body>'; } public function getBody($text) { return $text; } public function getFooter() { return '</body></html>'; } }
関連パターン
- Factory Methodパターン
- Strategyパターン
まとめ
共通化したい処理がある場合に使用すると良さそう。デメリットとしては、機能のパターンごとにサブクラスを作っていくことになるので、クラスの数が多くなってしまうことですね。