darudaru

だるだるしてるエンジニア

PHPでデザインパターン「Template Methodパターン」

GoFデザインパターンPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。

Template Methodパターンとは

テンプレートの機能を持つパターンです。スーパークラスでテンプレートの元となるメソッドが定義し、サブクラスでそのメソッドの具体的な処理を実装します。

Template Methodパターンの構造

templatemethod_m

  • Abstractionクラス テンプレートメソッドを実装し、そのテンプレートメソッドで使用しているメソッドを抽象メソッドで定義します。
  • Concreteクラス Abstractionクラスを継承し、抽象メソッドを実装します。

Abstractionクラスでは、抽象メソッドを定義し、その抽象メソッドを使用して処理するテンプレートメソッドを用意します。抽象メソッドは、Concreteクラスで実装します。

Template Methodパターンのメリット

  • ロジックを共通化できる

Template Methodパターンの実装例

htmlを出力する機能を実装します。

templatemethod

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パターン

まとめ

共通化したい処理がある場合に使用すると良さそう。デメリットとしては、機能のパターンごとにサブクラスを作っていくことになるので、クラスの数が多くなってしまうことですね。

デザインパターン