概要
アルゴリズムのスケルトンを定義しておき、その具体的なステップの実装をサブクラスに任せるパターン
以下の2種類のクラスからなる
- AbstractClassクラス(抽象化されたprimitive operation(2.で具体的に定義される)と、それらを呼び出すtemplate methodを定義
- ConcreteClassクラス(primitive operationを具体的に実装する)
具体例と実装
コース料理を例にすると
上記1,2はそれぞれ
- 共通コース料理クラス
- 和食コース料理クラス、中華コース料理クラス、フランスコース料理クラス
が対応する。
コードの詳細は以下
course_cuisine.rb
class CourceCuisine
  def searve_cource_cuisine # template method
    searve_appetizer
    searve_sub_dish
    searve_main_dish
    searve_desert
    searve_hot_drink
  end
  private
  def searve_appetizer # primitive operation
  end
  def searve_sub_dish # primitive operation
  end
  def searve_main_dish # primitive operation
  end
  def searve_desert # primitive operation
  end
  def searve_hot_drink # primitive operation
  end
  def serve(cuisine)
    # 客に#{cuisine}を提供するコードを実装
  end
end
japanese_course_cuisine.rb
class JapaneseCourceCuisine < CourceCuisine
  private
  def searve_appetizer
    serve('おひたし')
  end
  def searve_sub_dish
    serve('煮物')
  end
  def searve_main_dish
    serve('お刺身')
  end
  def searve_desert
    serve('和菓子')
  end
  def searve_hot_drink
    serve('日本茶')
  end
end
chinese_course_cuisine.rb
class ChineseCourceCuisine < CourceCuisine
  private
  def searve_appetizer
    serve('点心')
  end
  def searve_sub_dish
    serve('エビチリ')
  end
  def searve_main_dish
    serve('酢豚')
  end
  def searve_desert
    serve('杏仁豆腐')
  end
  def searve_hot_drink
    serve('中国茶')
  end
end
french_course_cuisine.rb
class FrenchCourceCuisine < CourceCuisine
  private
  def searve_appetizer
    serve('スープ')
  end
  def searve_sub_dish
    serve('ヒラメのムニエル')
  end
  def searve_main_dish
    serve('牛肉の赤ワイン煮込み')
  end
  def searve_desert
    serve('いちごムース')
  end
  def searve_hot_drink
    serve('コーヒー')
  end
end
メリット
- 共通の振る舞いを一箇所にまとめるため、DRYなコードが書ける
- primitive methodはtemplate methodからのみ呼び出され、protectedに定義されるため、委譲を使って機能の共通化と拡張を行う場合に比べて安全
まとめ
継承を使って処理の共通化を行うパターン
アルゴリズムのステップが共通で、ステップごとの詳細が異なる複数の機能を実装する場合に用いる