Какова поведенческая разница между шаблоном метода шаблона и шаблоном стратегии stati c? - PullRequest
0 голосов
/ 25 апреля 2020
#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. Может ли один быть лучше другого в какой-то ситуации, или это просто другой способ достичь того же самого?

...