头文件
//TemplateMethodPattern.h #ifndef TEMPLATE_METHOD_PATTERN_H #define TEMPLATE_METHOD_PATTERN_H #include <Windows.h> #include <iostream> using namespace std; namespace TemplateMethodPattern { ////////////////////////////////////////////////////////////////////////// class AbstractClass { public: AbstractClass(); virtual ~AbstractClass(); void TemplateMethod(); protected: virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; }; ////////////////////////////////////////////////////////////////////////// class ConcreteClassA : public AbstractClass { public: ConcreteClassA(); virtual ~ConcreteClassA(); protected: virtual void PrimitiveOperation1(); virtual void PrimitiveOperation2(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteClassB : public AbstractClass { public: ConcreteClassB(); virtual ~ConcreteClassB(); protected: virtual void PrimitiveOperation1(); virtual void PrimitiveOperation2(); }; ////////////////////////////////////////////////////////////////////////// void TemplateMethodPattern_Test(); } #endif
实现
#include "TemplateMethodPattern.h" namespace TemplateMethodPattern { ////////////////////////////////////////////////////////////////////////// AbstractClass::AbstractClass() {} AbstractClass::~AbstractClass() {} void AbstractClass::TemplateMethod() { PrimitiveOperation1(); cout<<"TemplateMethod"<<endl; PrimitiveOperation2(); } void AbstractClass::PrimitiveOperation1() { cout<<"Default Operation1"<<endl; } void AbstractClass::PrimitiveOperation2() { cout<<"Default Operation2"<<endl; } ////////////////////////////////////////////////////////////////////////// ConcreteClassA::ConcreteClassA() {} ConcreteClassA::~ConcreteClassA() {} void ConcreteClassA::PrimitiveOperation1() { cout<<"ConcreteA Operation1"<<endl; } void ConcreteClassA::PrimitiveOperation2() { cout<<"ConcreteA Operation2"<<endl; } ////////////////////////////////////////////////////////////////////////// ConcreteClassB::ConcreteClassB(){} ConcreteClassB::~ConcreteClassB(){} void ConcreteClassB::PrimitiveOperation1() { cout<<"ConcreteB Operation1"<<endl; } void ConcreteClassB::PrimitiveOperation2() { cout<<"ConcreteB Operation2"<<endl; } ////////////////////////////////////////////////////////////////////////// void TemplateMethodPattern_Test() { AbstractClass *pAbstractA = new ConcreteClassA; pAbstractA->TemplateMethod(); AbstractClass *pAbstractB = new ConcreteClassB; pAbstractB->TemplateMethod(); if (pAbstractA) delete pAbstractA; if (pAbstractB) delete pAbstractB; } }
客户端
#include "TemplateMethodPattern.h" #include <iostream> using namespace std; using namespace TemplateMethodPattern; void main() { TemplateMethodPattern_Test(); }
运行结果
用例模型
设计类图
顺序图