Java Academy · レッスン

Template Method:アルゴリズムの骨格定義

基底クラスでアルゴリズムの骨格を定義し、各手順をサブクラスに実装させます。

レッスン 4/414 ステップ

「Template Method:アルゴリズムの骨格定義」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Template Methodの意図

Template Methodは、基底クラスにアルゴリズムの骨格を定義し、一部のステップをサブクラスに委ねます。サブクラスは全体の構造を変更せずにステップをオーバーライドできます。

抽象基底クラス

基底クラスには、ステップを統括するテンプレートメソッド(通常はfinal)があります。抽象メソッドは変化するステップを表します。具象メソッドはデフォルトの振る舞いを提供します。

public abstract class DataProcessor {
    // Template method — final, defines the algorithm
    public final void process() {
        readData();
        processData();
        writeResult();
    }
    protected abstract void readData();
    protected abstract void processData();
    protected void writeResult() {
        System.out.println("Result written (default)");
    }
}

具象サブクラス

各サブクラスが抽象ステップを実装します。テンプレートメソッドの順序は決して変わらず、個々のステップの実装だけが変化します。

public class CSVProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading CSV..."); }
    protected void processData() { System.out.println("Parsing CSV rows..."); }
}
public class XMLProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading XML..."); }
    protected void processData() { System.out.println("Parsing XML nodes..."); }
    @Override
    protected void writeResult() { System.out.println("Writing XML result."); }
}

フックメソッド

フックとは、デフォルトの実装(多くの場合は空の実装)を持つ任意のステップです。サブクラスは、実装を強制されることなく、フックをオーバーライドして任意の振る舞いを追加できます。

public abstract class Game {
    public final void play() {
        initialize();
        while (!isDone()) takeTurn();
        printWinner();
    }
    protected void initialize() {}  // hook — optional override
    protected abstract boolean isDone();
    protected abstract void takeTurn();
    protected abstract void printWinner();
}

Template MethodとStrategyの比較

Template Methodは継承を使用します。骨格は基底クラスに固定され、ステップはサブクラスでオーバーライドされます。Strategyはコンポジションを使用し、アルゴリズム全体を外部化します。Strategyはより柔軟で、ステップが多くのコンテキストを共有する場合はTemplate Methodのほうが単純です。

Template MethodとしてのJava InputStream

java.io.InputStreamのread(byte[], int, int)は、抽象メソッドであるread()を使って実装されています。サブクラスは1バイト版を実装し、複数バイトの読み取りがテンプレートになります。

レポート生成用のTemplate Method

データを収集し、フォーマットして出力するレポートテンプレートを定義します。サブクラスを入れ替えることで、統括ロジックを変更せずにPDF、HTML、CSVへ出力できます。

public abstract class ReportGenerator {
    public final String generate() {
        List<Record> data = fetchData();
        String body = format(data);
        return wrap(body);
    }
    protected abstract List<Record> fetchData();
    protected abstract String format(List<Record> data);
    protected String wrap(String body) { return body; } // hook
}

テンプレートのオーバーライドを防ぐ

テンプレートメソッドをfinalとして宣言し、サブクラスがアルゴリズムの構造を変更できないようにします。オーバーライド可能にするのは、フックメソッドと抽象メソッドだけにします。

public final void process() {
    validate(); // abstract
    execute();  // abstract
    cleanup();  // hook with default
}

抽象ステップと具象ステップ

サブクラスが必ず提供しなければならないステップは抽象にします。カスタマイズのためにサブクラスが必要に応じてオーバーライドできればよい場合は、具象メソッド(空の実装でもかまいません)にします。

JUnitにおけるTemplate Method

JUnit 4のsetUp()とtearDown()は、テストランナーが定義するTemplate Methodのフックです。テストランナーがそれらを呼び出すタイミングを制御します。

SpringにおけるTemplate Method

SpringのJdbcTemplateは内部でTemplate Methodを使用しています。テンプレートが接続、ステートメントの作成、後処理を制御し、変化する「行のマッピング」ステップにはRowMapperラムダを指定します。

List<User> users = jdbcTemplate.query(
    "SELECT * FROM users",
    (rs, row) -> new User(rs.getLong("id"), rs.getString("name"))
);

深い継承を避ける

Template Methodは継承に依存するため、深いクラス階層を生み出す可能性があります。1~2レベルに制限してください。サブクラスが多くのステップをそれぞれ異なる方法でオーバーライドし始めたら、Strategyへの切り替えを検討します。

確認問題

サブクラスがテンプレートメソッドの順序を変更できないようにするキーワードは何ですか。

まとめ

Template Methodは、finalを指定した基底クラスにアルゴリズムの骨格を固定します。サブクラスは抽象ステップを実装し、必要に応じてフックをオーバーライドします。階層は浅く保ち、より高い柔軟性が必要な場合はStrategyを使用します。

無料で開始

AI チューターと学ぶ Java — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
104
レッスン
374

よくある質問

「Template Method:アルゴリズムの骨格定義」レッスンは無料ですか?

はい。「Template Method:アルゴリズムの骨格定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「Template Method:アルゴリズムの骨格定義」で何を学びますか?

基底クラスでアルゴリズムの骨格を定義し、各手順をサブクラスに実装させます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Template Method:アルゴリズムの骨格定義」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Observer パターン:イベント通知
  2. Strategy パターン:交換可能なアルゴリズム
  3. Command パターン:操作のカプセル化
  4. Template Method:アルゴリズムの骨格定義
← Java Academyに戻る