2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Template Methodパターン

0. はじめに

この記事では、Template Methodパターンについて、以下の3点に分けて説明します。

  • 定義と利点
    Template Methodパターンの概要とその利点について説明します。
  • 主要なコンポーネント
    パターンの主要な構成要素について詳しく解説します。
  • 実装例
    実際にJavaでTemplate Methodパターンを使ったコード例を紹介し、どのように実装するのかを説明します。

1. 定義と利点

Template Methodパターンは、スーパークラスでアルゴリズムの「枠組み」を定義し、その中の一部の処理をサブクラスで「具体的な内容」として実装させるデザインパターンです。このパターンにより、アルゴリズムの基本的な流れは変更せずに、個々の処理だけをサブクラスで変更できるようになります。

このパターンを使用すると、以下のような利点があります。

  • コードの再利用性: アルゴリズムの枠組みをスーパークラスにまとめることで、共通の処理部分を再利用できます
  • 拡張性: サブクラスで詳細部分を変更・追加できるため、新たな処理を加えることが容易になります
  • 一貫性の維持: アルゴリズムの流れや順序がスーパークラスで決まっているため、異なるサブクラスでも同じ流れで処理を行うことができます。これにより、コードの一貫性を保つことができます
  • 管理の容易さ: アルゴリズムの変更があった場合、スーパークラスで修正するだけで全てのサブクラスに反映されるため、メンテナンスが容易です

例えば、Webページを生成するアルゴリズムを考えた場合、テンプレートメソッドパターンを使うと、ページの「基本的な構成」はスーパークラスに実装し、ページの「具体的な内容」や「レイアウト」をサブクラスに実装することができます。これにより、基本構造は共通に保ちながら、ページの内容やデザインを柔軟に変更できます。

Template Methodパターンは、特にアルゴリズムの骨組みを変更することなく、具体的な処理部分だけを変更したい場合に非常に有効です。

2. 主要なコンポーネント

Template Methodパターンは、次の主要なコンポーネントから構成されています。

  • AbstractClass(抽象クラス)

    • アルゴリズムを記載します
    • 抽象メソッドを宣言します
  • ConcreteClass(具象クラス)

    • 抽象メソッドの具体的な処理を実装します

3. 実装例

実装例ではクラス図とコードの2点に分けて記載します。

クラス図

Template Methodパターンのクラス図を示します。この図では、抽象クラスと具象クラスの関係が示されています。

コード

以下はTemplateMethodパターンを実際に実行するためのコードです。

// AbstractDisplay.java
// 抽象クラス①
public abstract class AbstractDisplay {
  protected abstract void open();
  protected abstract void print();
  protected abstract void close();
  // final修飾子によりサブクラスでアルゴリズムをオーバーライドさせない
  public final void display() {
    open();
    for (int i = 0; i < 5; i++) {
      print();
    }
    close();
  }
}


// CharDisplay.java
// 具象クラス①
public class CharDisplay extends AbstractDisplay {
  private char ch;
  public CharDisplay(char ch) {
    this.ch = ch;
  }
  public void open() {
    System.out.print("<<");
  }
  public void print() {
    System.out.print(ch);
  }
  public void close() {
    System.out.println(">>");
  }
}


// StringDisplay.java
// 具象クラス②
public class StringDisplay extends AbstractDisplay {
  private String string;
  private int width;
  public StringDisplay(String string) {
    this.string = string;
    this.width = string.getBytes().length;
  }
  public void open() {
    printLine();
  }
  public void print() {
    System.out.println("|" + string + "|");
  }
  public void close() {
    printLine();
  }
  private void printLine() {
    System.out.print("+");
    System.out.print("+");
    for (int i = 0; i < width; i++) {
      System.out.print("-");
    }
    System.out.println("+");
  }
}


// TemplateMethodTest.java
// 実行コードを記載
public class  TemplateMethodTest {
  public static void main(String[] args) {
    AbstractDisplay d1 = new CharDisplay('H');
    AbstractDisplay d2 = new StringDisplay("Hello, world.");
    AbstractDisplay d3 = new StringDisplay("こんにちは。");
    d1.display();
    d2.display();
    d3.display();
  }
}

参考文献

この記事は以下の情報を参考にして執筆しました。
増補改訂版 Java言語で学ぶデザインパターン入門

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?