Подробнее на 👉 refactoring.guru
#include <iostream>
// AbstractClass
class AbstractClass {
public:
void templateMethod() {
step1();
step2();
}
virtual void step1() = 0;
virtual void step2() = 0;
};
// ConcreteClass1
class ConcreteClass1 : public AbstractClass {
public:
void step1() override {
std::cout << "ConcreteClass1: Выполнение шага 1" << std::endl;
}
void step2() override {
std::cout << "ConcreteClass1: Выполнение шага 2" << std::endl;
}
};
// ConcreteClass2
class ConcreteClass2 : public AbstractClass {
public:
void step1() override {
std::cout << "ConcreteClass2: Выполнение шага 1" << std::endl;
}
void step2() override {
std::cout << "ConcreteClass2: Выполнение шага 2" << std::endl;
}
};
// Клиентский код
int main() {
AbstractClass* concreteClass1 = new ConcreteClass1();
AbstractClass* concreteClass2 = new ConcreteClass2();
// Вызываем шаблонный метод для каждого объекта
concreteClass1->templateMethod();
concreteClass2->templateMethod();
delete concreteClass1;
delete concreteClass2;
return 0;
}
Будет напечатано:
ConcreteClass1: Выполнение шага 1 ConcreteClass1: Выполнение шага 2 ConcreteClass2: Выполнение шага 1 ConcreteClass2: Выполнение шага 2
abstract class AbstractClass {
void templateMethod() {
step1();
step2();
}
void step1();
void step2();
}
class ConcreteClass1 extends AbstractClass {
void step1() {
print('ConcreteClass1: Выполнение шага 1');
}
void step2() {
print('ConcreteClass1: Выполнение шага 2');
}
}
class ConcreteClass2 extends AbstractClass {
void step1() {
print('ConcreteClass2: Выполнение шага 1');
}
void step2() {
print('ConcreteClass2: Выполнение шага 2');
}
}
void main() {
var concreteClass1 = ConcreteClass1();
var concreteClass2 = ConcreteClass2();
concreteClass1.templateMethod();
concreteClass2.templateMethod();
}
Будет напечатано:
ConcreteClass1: Выполнение шага 1 ConcreteClass1: Выполнение шага 2 ConcreteClass2: Выполнение шага 1 ConcreteClass2: Выполнение шага 2