Вы, вероятно, имеете в виду шаблонный шаблон.
Вы правы, они удовлетворяют очень похожие потребности.
Я бы сказал, что лучше использовать метод шаблона в тех случаях, когда у вас есть «шаблонный» алгоритм, имеющий определенные шаги, где подклассы переопределяют эти шаги, чтобы изменить некоторые детали.
В случае стратегии вам нужно создать интерфейс, и вместо наследования вы используете делегирование. Я бы сказал, что это немного более мощный паттерн и, возможно, лучше в соответствии с принципами инверсии зависимостей DIP. Он более мощный, потому что вы четко определяете новую абстракцию стратегии - способ сделать что-то, что не относится к шаблонному методу. Итак, если эта абстракция имеет смысл - используйте ее. Тем не менее, использование метода шаблона может дать вам более простой дизайн в простых случаях, что также важно.
Подумайте, какие слова подходят лучше: у вас есть шаблонный алгоритм? Или ключевым моментом здесь является то, что у вас есть абстракция стратегии - новый способ что-то сделать
Пример метода шаблона:
Application.main()
{
Init();
Run();
Done();
}
Здесь вы наследуете от приложения и подставляете, что именно будет сделано при инициализации, запуске и выполнении.
Пример стратегии:
array.sort (IComparer<T> comparer)
Здесь при написании компаратора вы не наследуете от массива. Array делегирует алгоритм сравнения для сравнения.