【デザインパターン】Template MethodとStrategyの違い

Template methodとStrategyはともに「アルゴリズムを変更可能にする」という目的がある.
Template methodとStrategyの違いとして,一般的に下記のようなことが言われている.

しかし実際にはそうではない. Strategyでも継承を使うし,Template methodでも実行時にアルゴリズムを選択する書き方もできる. 要は実装での書き方の違いでしかない.

本質的にはどこが違うのだろう.

クラス図でみる違い

Template Method

http://i.stack.imgur.com/z1N7Q.gif

Strategy

http://i.stack.imgur.com/jIjIF.gif

これを見ると違いがわかる. Strategyの方は,全く異なるアルゴリズムごっそり差し替えるためのパターンだ.

一方でTemplate Methodの方は"template method"の名の通り,アルゴリズムの実行ステップを手順として規定しておいて,各ステップ内の処理をサブクラスに実装させている. Template methodは将来の実装のためのガイドとも言える. なお実行ステップを記述するtemplate methodは当然overrideされないようにしておく.