💠

【デザインパターン】Template Method

2023/03/01に公開約1,700字

Template Methodについて

オブジェクト指向プログラミングにおけるデザインパターンの一つであるTemplate Methodについて解説します。

Template Methodは、アルゴリズムの骨格を定義し、一部をサブクラスに残して、そのサブクラスでアルゴリズムの詳細を定義する方法を提供します。

簡単な表現で言い換えると、親クラスで枠組みを定め、子クラスで枠組みの具体的な内容を定めるようなパターンになります。

Template Methodの構成要素

Template Methodは継承を利用したパターンであり、以下の構成要素で成り立っています

  • AbstractClass(抽象クラス):処理全体の流れを決定するテンプレートメソッド
  • ConcreteClass(具象クラス):AbstractClassを継承して、定義されている抽象メソッドを実装する

Template Methodを使うと何が嬉しいのか

  • 共通処理を親クラスにまとめることができる
  • 処理全体の流れは変えずに、子クラス処理の一部の内容を変更することができる

そのため処理フローが同じで、その中の一部の処理内容が異なる場合に、その異なる部分のみを子クラスに担当してもらいたいというときに有効です。多少の違いはあるけれども、ほぼ同じ処理が複数あるクラスなどで使いたいですね。

Template Methodを利用した例

実際にコードで具体例を確認しましょう。

テストの準備をするsetupメソッド、テストを実行するexecuteメソッド、テストを解体するteardownメソッドを実装しています。

構成要素を当てはめると以下のようになります。

  • AbstractClass(抽象クラス):TestTemplate
  • ConcreteClass(具象クラス):ArticleServiceTest、ScheduleServiceTest
export { }

abstract class TestTemplate {
  test() {
    this.setup();
    this.execute();
    this.teardown();
  }

  abstract setup();
  abstract execute();

  teardown() {
    console.log("teardown");
  }
}

class ArticleServiceTest extends TestTemplate {
  setup() {
    console.log("setup: ArticleServiceTest");
  }

  execute() {
    console.log("execute: ArticleServiceTest");
  }
}

class ScheduleServiceTest extends TestTemplate {
  setup() {
    console.log("setup: ScheduleServiceTest");
  }

  execute() {
    console.log("execute: ScheduleServiceTest");
  }
}

const articleServiceTest = new ArticleServiceTest();
const scheduleServiceTest = new ScheduleServiceTest();
articleServiceTest.test();
scheduleServiceTest.test();

上記のようにすることで、親クラスで枠組みを定め、子クラスで枠組みの具体的な内容を決めることができていますね。

そして共通処理であるteardownは使い回すことができています。

またこのようにすることで新しくTestクラスを作成した場合にも各子クラスごとに異なるsetUp, executeメソッドの実装漏れもなくなりますね。

Discussion

ログインするとコメントできます