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 を使うことでロジックが共通化できる。
関連パターン
- PHP7でデザインパターン入門8/23 Abstract Factoryパターン - Do Something
- PHP7でデザインパターン入門10/23 Strategyパターン - Do Something
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (399件) を見る