Advertisement
Guest User

Untitled

a guest
Nov 29th, 2022
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.58 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. /**
  4.  * Паттерн Шаблонный метод
  5.  *
  6.  * Назначение: Определяет общую схему алгоритма, перекладывая реализацию
  7.  * некоторых шагов на подклассы. Шаблонный метод позволяет подклассам
  8.  * переопределять отдельные шаги алгоритма без изменения структуры алгоритма.
  9.  */
  10. /**
  11.  * Абстрактный Класс определяет шаблонный метод, содержащий скелет некоторого
  12.  * алгоритма, состоящего из вызовов (обычно) абстрактных примитивных операций.
  13.  *
  14.  * Конкретные подклассы должны реализовать эти операции, но оставить сам
  15.  * шаблонный метод без изменений.
  16.  */
  17. class AbstractClass {
  18.   /**
  19.    * Шаблонный метод определяет скелет алгоритма.
  20.    */
  21.  public:
  22.   void TemplateMethod() const {
  23.     this->BaseOperation1();
  24.     this->RequiredOperations1();
  25.     this->BaseOperation2();
  26.     this->Hook1();
  27.     this->RequiredOperation2();
  28.     this->BaseOperation3();
  29.     this->Hook2();
  30.   }
  31.   /**
  32.    * Эти операции уже имеют реализации.
  33.    */
  34.  protected:
  35.   void BaseOperation1() const {
  36.     std::cout << "AbstractClass says: I am doing the bulk of the work\n";
  37.   }
  38.   void BaseOperation2() const {
  39.     std::cout << "AbstractClass says: But I let subclasses override some operations\n";
  40.   }
  41.   void BaseOperation3() const {
  42.     std::cout << "AbstractClass says: But I am doing the bulk of the work anyway\n";
  43.   }
  44.   /**
  45.    * А эти операции должны быть реализованы в подклассах.
  46.    */
  47.   virtual void RequiredOperations1() const = 0;
  48.   virtual void RequiredOperation2() const = 0;
  49.   /**
  50.    * Это «хуки». Подклассы могут переопределять их, но это не обязательно,
  51.    * поскольку у хуков уже есть стандартная (но пустая) реализация. Хуки
  52.    * предоставляют дополнительные точки расширения в некоторых критических
  53.    * местах алгоритма.
  54.    */
  55.   virtual void Hook1() const {}
  56.   virtual void Hook2() const {}
  57. };
  58. /**
  59.  * Конкретные классы должны реализовать все абстрактные операции базового
  60.  * класса. Они также могут переопределить некоторые операции с реализацией по
  61.  * умолчанию.
  62.  */
  63. class ConcreteClass1 : public AbstractClass {
  64.  protected:
  65.   void RequiredOperations1() const override {
  66.     std::cout << "ConcreteClass1 says: Implemented Operation1\n";
  67.   }
  68.   void RequiredOperation2() const override {
  69.     std::cout << "ConcreteClass1 says: Implemented Operation2\n";
  70.   }
  71. };
  72. /**
  73.  * Обычно конкретные классы переопределяют только часть операций базового
  74.  * класса.
  75.  */
  76. class ConcreteClass2 : public AbstractClass {
  77.  protected:
  78.   void RequiredOperations1() const override {
  79.     std::cout << "ConcreteClass2 says: Implemented Operation1\n";
  80.   }
  81.   void RequiredOperation2() const override {
  82.     std::cout << "ConcreteClass2 says: Implemented Operation2\n";
  83.   }
  84.   void Hook1() const override {
  85.     std::cout << "ConcreteClass2 says: Overridden Hook1\n";
  86.   }
  87. };
  88. /**
  89.  * Клиентский код вызывает шаблонный метод для выполнения алгоритма. Клиентский
  90.  * код не должен знать конкретный класс объекта, с которым работает, при
  91.  * условии, что он работает с объектами через интерфейс их базового класса.
  92.  */
  93. void ClientCode(AbstractClass *class_) {
  94.   // ...
  95.   class_->TemplateMethod();
  96.   // ...
  97. }
  98.  
  99. int main() {
  100.   std::cout << "Same client code can work with different subclasses:\n";
  101.   ConcreteClass1 *concreteClass1 = new ConcreteClass1;
  102.   ClientCode(concreteClass1);
  103.   std::cout << "\n";
  104.   std::cout << "Same client code can work with different subclasses:\n";
  105.   ConcreteClass2 *concreteClass2 = new ConcreteClass2;
  106.   ClientCode(concreteClass2);
  107.   delete concreteClass1;
  108.   delete concreteClass2;
  109.   return 0;
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement