読者です 読者をやめる 読者になる 読者になる

PHP7でデザインパターン入門3/23 Template Methodパターン

Template Method パターンとは

スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンのこと。

Template Method パターン - Wikipedia

example

文字や文字列を5回繰り返して表示する、というプログラムをtemplate methodパターンを使って作成する。

AbstractDisplay抽象クラス

<?php
abstract class AbstractDisplay {
    abstract public function open();
    abstract public function print();
    abstract public function close();

    public final function display() {
        $this->open();
        for ($i = 0; $i < 5; $i++) {
            $this->print();
        }
        $this->close();
    }
}

AbstractDisplayを継承したCharDisplayクラス

<?php
class CharDisplay extends AbstractDisplay {
    private $ch;

    public function __construct(string $ch) {
        $this->ch = $ch;
    }
    public function open() {
        echo("<<");
    }
    public function print() {
        echo($this->ch);
    }
    public function close() {
        echo(">>" . PHP_EOL);
    }
}

AbstractDisplayを継承したStringDisplayクラス

<?php
class StringDisplay extends AbstractDisplay {
    private $string;
    private $width;

    public function __construct(string $string) {
        $this->string = $string;
        $this->width = strlen(mb_convert_encoding($string, 'SJIS', 'UTF-8'));
    }
    public function open() {
        $this->printLine();
    }
    public function print() {
        echo("|" . $this->string . "|" . PHP_EOL);
    }
    public function close() {
        $this->printLine();
    }
    private function printLine() {
        echo("+");
        for ($i = 0; $i < $this->width; $i++) {
            echo("-");
        }
        echo("+" . PHP_EOL);
    }
}

main

<?php
(new CharDisplay('H'))->display();
(new StringDisplay("Hello, world."))->display();
(new StringDisplay("こんにちは。"))->display();

実行結果

<<HHHHH>>
+-------------+
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
+-------------+
+------------+
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
+------------+

役割

AbstractClass(抽象クラス)

テンプレートメソッドを実装する。サブクラスであるConcreteClassによって実装される。

ConcreteClass(具象クラス)

抽象メソッドを実装する。ここで実装したメソッドは、AbstractClassのテンプレートメソッドから呼び出される。

まとめ

スーパークラスで処理の骨組みを規定し、サブクラスで処理の内容を具体化する。 template method を使うことでロジックが共通化できる。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門