Istotą wzorca jest stworzenie niezmiennej metody sterującej w klasie bazowej, która wywołuje różne funkcje wg zdefiniowanego schematu.

Metoda szablonowa jest stała, a wywoływane funkcje są zmienne (przedefiniowywane w zależności od wymagań).

Przykładem wykorzystania wzorca może być szkielet aplikacji, który ma zdefiniowaną kolejność wywoływania charakterystycznych metod np. start, pobierz dane od użytkownika, przekaż przetworzone dane użytkownikowi, zakończ. Ich docelowa implementacja będzie różna w zależności od aplikacji, ale kolejność ich wywoływania zwykle będzie taka sama.


#include <iostream>
#include <vector>
#include <numeric>

class CApplication
{
protected:
    virtual void Init() = 0;
    virtual void Work() = 0;
    virtual bool Exit() = 0;

public:
    void Run()
    {
        Init();
        while (!Exit())
            Work();
    }
};

class CNewApplication : public CApplication
{
private:
    std::vector<int> numbers;
    bool exit;

protected:
    void Init() { exit = false; }

    void Work()
    {
        std::cout << "Wprowadź liczbę (lub q, aby zakończyć): ";

        int number = 0;
        std::cin >> number;

        exit = number == 0;

        if (!exit)
            numbers.push_back(number);
    }

    bool Exit()
    {
        if (exit)
        {
            int total = accumulate(numbers.begin(), numbers.end(), 0);
            std::cout << "Suma wprowadzonych liczb: " << total << std::endl;
        }
        return exit;
    }

public:
    CNewApplication() : exit(false) {}
};

int main(int nArguments, char* szArguments[])
{
    CNewApplication app;
    app.Run();

    return 0;
}


0 Komentarzy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *