Template Method

レポートを生成する

処理の骨格は固定し、一部だけ差し替える

このデモで分かること: レポート生成の手順は固定のまま、本体の書式だけ差し替える

このデモで Template Method を使う理由

  • レポート生成の手順(見出し→本体→件数フッター)自体は、出力形式が変わっても同じ。
  • 形式ごとに手順を丸ごとコピーすると、見出しやフッターの修正を形式の数だけ繰り返すことになる。
  • Template Method なら手順は親クラスに固定し、変わる本体部分だけをサブクラスで上書きできる。

パターンなし vs このパターン(イメージ)

記事の本編ではなく、このデモ題材を if の山にした場合との対比です(疑似コード)。

パターンなし

// パターンなし(イメージ)
if ("csv".equals(format)) {
  sb.append(header()).append(csvBody(items)).append(footer());
} else if ("json".equals(format)) {
  sb.append(header()).append(jsonBody(items)).append(footer());
}
// → header/footer の呼び出しが形式の数だけ重複

Template Method あり

// Template Method
report = generator.generate(items);
// → 手順は ReportGenerator.generate() に固定
// → 本体だけ CsvReportGenerator / JsonReportGenerator が上書き

デモ

結果

=== CSV レポート ===
田中,鈴木,佐藤
--- 件数: 3 ---

本体部分を上書きしている実装クラス

CsvReportGenerator

見出し・フッターは ReportGenerator(親クラス)が共通で作ります。

操作 → 動いたクラス / メソッド

  1. 操作: 出力形式「csv」で項目 3 件のレポートを生成
  2. → CsvReportGenerator.generate(items)
  3. → ReportGenerator.generate() … 手順(見出し→本体→フッター)は固定(テンプレート)
  4. → CsvReportGenerator.formatBody(items) … いま動いている具象の可変部分
  5. → 見出し・フッターは共通処理のまま
記事は考え方・別サンプルの解説です。このページのデモ実装とはソースが異なります
(クラス名・題材はデモ用に簡略化しています)。