Шаблонный метод (Template method) :: Cетевой уголок Majestio

Шаблонный метод (Template method)


Шаблонный метод — это поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#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
Рейтинг: 0/5 - 0 голосов