アジャイルソフトウェア開発の奥義のメモ 14章
14章 継承と委譲 template method と strategy の違い
http://yusuke-ujitoko.hatenablog.com/entry/2009/12/29/000000
https://www.slideshare.net/mobile/gaaupp/ss-36273759
これらの記事でも述べられているが、
Strategyの方は,細かいパーツをinterfaceとして用意し、それを使って全く異なるアルゴリズムにごっそり差し替えられるようにしておくためのパターン。
Templateメソッドパターンはあるアルゴリズムを使う前提で、アルゴリズムの大きな流れのテンプレートを継承して拡張できるようにするためのパターン。
Strategyパターンでは、ソートの方法(実装)とソートに使う基本的な計算のパーツとに分けておき、そのパーツだけをinterfaceに切り出しておく。つまりパーツは使いまわせるが、必ずしもバブルソートという具体的なソートの方法のために使う必要はない状態になっている。
Template methodパターンでは、抽象クラスがソートの方法と計算のパーツの両方を知っているということになってしまっている。これではこの二つは分けられず、計算のパーツだけを使いまわして別の新しいアルゴリズムに切り替えるということがやりにくい。
書籍では継承と委譲という対比で書かれているが、責務の切り出しの大小の違いと考えた方が良さそう。 Strategyパターンが優れていると書かれているが、実際にはおそらく場合によって責務の切り出しが必要でないような場合にはTemplate methodを使った方が単純で見通しが良い場合もあるはず。