#include <iostream>
// ----------------------------------------------------
class TemplateMethod
{
protected:
virtual void operation() = 0;
public:
virtual void method() final
{
std::cout << "Before doing operation.\n";
operation();
std::cout << "After doing operation.\n";
}
};
class DoSomething1 : public TemplateMethod
{
virtual void operation() override
{
std::cout << "Doing some operation...\n";
}
};
// ----------------------------------------------------
class Strategy
{
public:
virtual void operation() = 0;
};
class Strategy1 : public Strategy
{
public:
virtual void operation() override
{
std::cout << "Doing some operation...\n";
}
};
template <typename strategy>
class DoSomething2
{
strategy s;
public:
void method()
{
std::cout << "Before doing operation.\n";
s.operation();
std::cout << "After doing operation.\n";
}
};
// ----------------------------------------------------
int main()
{
DoSomething1 d1;
DoSomething2<Strategy1> d2;
d1.method();
std::cout << '\n';
d2.method();
}
Вывод:
Before doing operation.
Doing some operation...
After doing operation.
Before doing operation.
Doing some operation...
After doing operation.
Мой вопрос не совпадает с этот вопрос . В упомянутом вопросе говорится о разнице между шаблоном dynamic strategy
и шаблоном template method
. Здесь я говорю о static strategy
, где используемая стратегия известна во время компиляции и не может быть изменена во время выполнения. Здесь и strategy
, и template method
ведут себя одинаково. В шаблоне strategy
, если я хочу иметь какое-то поведение, я напишу новый класс strategy
и реализую logi c внутри метода operation
внутри этого класса и передам в качестве аргумента шаблона. В шаблоне template method
, если я хочу иметь какое-то поведение, я сделаю класс производным от TemplateMethod
, переопределю метод operation
и реализую внутри него логику c. Может ли один быть лучше другого в какой-то ситуации, или это просто другой способ достичь того же самого?