Advertisement
dllbridge

Template Method

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