概要
アルゴリズムのスケルトンを定義しておき、その具体的なステップの実装をサブクラスに任せるパターン
以下の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に定義されるため、委譲を使って機能の共通化と拡張を行う場合に比べて安全
まとめ
継承を使って処理の共通化を行うパターン
アルゴリズムのステップが共通で、ステップごとの詳細が異なる複数の機能を実装する場合に用いる