#include <iostream>
#include <string>
#include <memory>

// Abstract base class: defines the skeleton of the algorithm (template method)
class DataProcessor {
public:
    virtual ~DataProcessor() = default;

    // Template method: defines the order of algorithm steps, often declared final to prevent overriding
    void process() {
        readData();
        processData();
        saveData();
    }

protected:
    // Primitive methods: implemented by subclasses
    virtual void readData() = 0;
    virtual void processData() = 0;

    // Hook method: provides a default implementation that subclasses may override
    virtual void saveData() {
        std::cout << "[Base] Saving data to default storage..." << std::endl;
    }
};

// Concrete class A: processes CSV data
class CsvProcessor : public DataProcessor {
protected:
    void readData() override {
        std::cout << "[CSV] Reading data from CSV file..." << std::endl;
    }

    void processData() override {
        std::cout << "[CSV] Parsing and filtering CSV rows..." << std::endl;
    }

    // Override hook method to provide custom save behavior
    void saveData() override {
        std::cout << "[CSV] Saving processed CSV to database..." << std::endl;
    }
};

// Concrete class B: processes JSON data and keeps default save behavior
class JsonProcessor : public DataProcessor {
protected:
    void readData() override {
        std::cout << "[JSON] Reading data from JSON file..." << std::endl;
    }

    void processData() override {
        std::cout << "[JSON] Transforming JSON structure..." << std::endl;
    }

    // saveData is not overridden; base class default implementation is used
};

// Client code
int main() {
    std::cout << "=== Template Method Pattern Demo ===" << std::endl;

    // Use CsvProcessor
    std::unique_ptr<DataProcessor> csvProc = std::make_unique<CsvProcessor>();
    std::cout << "\nProcessing CSV:" << std::endl;
    csvProc->process();   // Invoke template method

    // Use JsonProcessor
    std::unique_ptr<DataProcessor> jsonProc = std::make_unique<JsonProcessor>();
    std::cout << "\nProcessing JSON:" << std::endl;
    jsonProc->process();  // Invoke template method

    return 0;
}

results matching ""

    No results matching ""