0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-15

概要

アルゴリズムのスケルトンを定義しておき、その具体的なステップの実装をサブクラスに任せるパターン

以下の2種類のクラスからなる
1. AbstractClassクラス(抽象化されたprimitive operation(2.で具体的に定義される)と、それらを呼び出すtemplate methodを定義
2. ConcreteClassクラス(primitive operationを具体的に実装する)

具体例と実装

コース料理を例にすると

上記1,2はそれぞれ
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に定義されるため、委譲を使って機能の共通化と拡張を行う場合に比べて安全

まとめ

継承を使って処理の共通化を行うパターン
アルゴリズムのステップが共通で、ステップごとの詳細が異なる複数の機能を実装する場合に用いる

0
0
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
0
0