1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #ifndef TEMPLATE_METHOD_H #define TEMPLATE_METHOD_H
class AbstractClass { public: virtual ~AbstractClass() = default; void templateMethod() { stepOne(); stepTwo(); stepThree(); if (hookMethod()) { stepFour(); } } protected: void stepOne() { std::cout << "AbstractClass: 执行步骤一" << std::endl; } virtual void stepTwo() = 0; void stepThree() { std::cout << "AbstractClass: 执行步骤三" << std::endl; } virtual bool hookMethod() { return true; } virtual void stepFour() = 0; };
class ConcreteClassA : public AbstractClass { protected: void stepTwo() override { std::cout << "ConcreteClassA: 执行步骤二" << std::endl; } void stepFour() override { std::cout << "ConcreteClassA: 执行步骤四" << std::endl; } };
class ConcreteClassB : public AbstractClass { protected: void stepTwo() override { std::cout << "ConcreteClassB: 执行步骤二" << std::endl; } bool hookMethod() override { std::cout << "ConcreteClassB: 重写钩子方法,返回false" << std::endl; return false; } void stepFour() override { std::cout << "ConcreteClassB: 执行步骤四" << std::endl; } };
#endif
|