Да - выбор шаблона проектирования иногда перемещает логику, а не заменяет ее.
Хотя я не совсем понимаю ваше возражение. Некоторая часть логики принятия решения уже в клиенте, и стратегия консолидирует решение.
В вашем примере кода
void Composition::Repair () {
switch (_breakingStrategy) {
case SimpleStrategy:
ComposeWithSimpleCompositor();
break;
case TeXStrategy:
ComposeWithTeXCompositor();
break;
// ...
}
// merge results with existing composition, if necessary
}
поле _breakingStrategy
должно быть где-то предоставлено, предположительно клиентским кодом, определяющим, какой метод композиции использовать, и передаёт результат этого решения в качестве значения _breakingStrategy
.
Единственное, что применяет Стратегия, - это принятие решения, предоставляющего подкласс Стратегии, а не «код типа», как сейчас, консолидирующего решение.
Решение, конечно, должно быть где-то принято. Если вы чувствуете, что метод Composition::Repair
является подходящим местом для него, вы, конечно, можете вообще не использовать шаблон Стратегии.
Если вы хотите использовать стратегию, но вам не нужна логика в клиенте (больше, чем она уже есть), ее может предоставить фабричный метод, содержащий аналогичный переключатель.