#include <iostream>
#include <string>
#include <memory>
class DataProcessor {
public:
virtual ~DataProcessor() = default;
void process() {
readData();
processData();
saveData();
}
protected:
virtual void readData() = 0;
virtual void processData() = 0;
virtual void saveData() {
std::cout << "[Base] Saving data to default storage..." << std::endl;
}
};
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;
}
void saveData() override {
std::cout << "[CSV] Saving processed CSV to database..." << std::endl;
}
};
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;
}
};
int main() {
std::cout << "=== Template Method Pattern Demo ===" << std::endl;
std::unique_ptr<DataProcessor> csvProc = std::make_unique<CsvProcessor>();
std::cout << "\nProcessing CSV:" << std::endl;
csvProc->process();
std::unique_ptr<DataProcessor> jsonProc = std::make_unique<JsonProcessor>();
std::cout << "\nProcessing JSON:" << std::endl;
jsonProc->process();
return 0;
}