1、template.h
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <iostream>
using namespace std;
class BaseThread //AbstractClass,
{
public:
BaseThread();
virtual ~BaseThread();
//模板方法TemplateMethod(),启动线程的入口,是非虚成员方法,声明为public,好由外部对象调用些方法
int Start();
protected:
//线程调用工作方法的入口,这是基类实现的具体方法,不需要子类重新实现,声明为protected,不让外部对象调用
static void* Run(void* pParam);
//原语操作(Primitive Operation),线程工作方法,钩子方法由子类扩展,由子类加以实现具体的操作,声明为protected
virtual int DoWork();
};
class MyThread : public BaseThread //ConcreteClass,
{
public:
MyThread();
virtual ~MyThread();
protected:
virtual int DoWork();//扩展钩子方法,具体类的具体实现
};
#endif // TEMPLATE_H
2、template.cpp
#include "template.h"
BaseThread::BaseThread()
{
cout << "BaseThread::CBaseThread()" << endl;
}
BaseThread:: ~BaseThread()
{
cout << "BaseThread::~CBaseThread()" << endl;
}
int BaseThread::Start()
{
cout << "BaseThread::Start()" << endl;
Run(this); //在这里调用此方法
return 0;
}
void* BaseThread::Run(void* pParam)
{
cout << "BaseThread::Run()" << endl;
BaseThread* pThread = static_cast<BaseThread*>(pParam);//这句话很重要,强制类型转换
pThread->DoWork();//在这里调用具体子类中的钩子方法
return NULL;
}
int BaseThread::DoWork()
{
cout << "BaseThread::DoWork()" << endl;
return 0;
}
MyThread::MyThread()
{
cout << "MyThread::MyThread()" << endl;
}
MyThread::~MyThread()
{
cout << "MyThread::~MyThread()" << endl;
}
int MyThread::DoWork()
{
cout << "MyThread::DoWork(),concrete realization of ConcreteClass" << endl;
return 0;
}
3、main.cpp
/*
作者:jhluroom弹 QQ:454676244 MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/
定义:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法(Template Method)使得子类可以不改变一个算法的结构即可
重定义该算法的某些特定步骤。
理解:
1.AbstractClass是一个抽象的基类:定义一系列的抽象原语操作(Primitive Operation)。具体的子类(Concrete Class)将
重新实现这些操作。原语操作实际上就是虚方法.基类定义和实现了模板方法(Template Method)。模板方法调用基类定义的原语操作
或其他方法完成一个算法的骨架。模板方法是非虚方法,子类不需要重新实现模板方法。
2.ConcreteClass是具体的子类,实现抽象基类的原语操作。
3.模板方法模式使得子类可以不改变一个算法的结构,就可重定义该算法的某些特定步骤。这些都是利用了C++的继承和多态特性.
要点:
1.模版方法模式在软件设计和代码复用中使用非常广泛,利用面向对象的多态特性,以至于很多时候你用到了模板方法,但你却没有发现。
2.基类的模版方法调用的方法可以是:具体方法、虚方法、纯虚方法。由于这些方法仅供TemplateMethod方法调用,因此最好是protected的。
具体方法:不需要子类重新实现。这是模板方法调用中中不可变的部分,可变发部分留给子类扩展实现。
纯虚方法:必须要求子类重新实现。
虚方法:基类提供了默认实现(一般是空方法),子类可根据需求来选择是否重新实现。这类方法通常叫做钩子方法(Hook Method),
钩子方法来源于Windows的消息处理机制,命名一般约定是Do开头的。
3.模板方法模式,要尽量减少抽象原语操作的数量,即尽量减少纯虚方法和钩子方法的数量,基类尽量实现更多的具体方法。
4.模板方法是非虚成员方法,子类不需要重新实现模板方法。
5.模板方法模式,其实是反向控制结构。基类的模板方法调用子类延迟实现的钩子方法。
应用:
这里用一个线程类的实现来解释模板方法设计模式的应用。
线程调用的过程是:创建线程、调用线程方法。这个逻辑是不变的,线程调用的过程就是模板方法。
线程执行的工作内容是变化的,每个继承的线程类的工作内容是不同的。线程的工作方法就是抽象原语操作,
基类通过扩展这个钩子方法实现不同的需求。
以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/
#include <QtCore/QCoreApplication>
#include "template.h"
int main(int argc, char *argv[])
{
cout << "=== jhluroom start ========" << endl;
BaseThread* pThread = new MyThread();
pThread->Start();
delete pThread;
cout << "=== jhluroom finish _^_ ===" << endl;
return 0;
}
运行结果:
=== jhluroom start ========
BaseThread::CBaseThread()
MyThread::MyThread()
BaseThread::Start()
BaseThread::Run()
MyThread::DoWork(),concrete realization of ConcreteClass
MyThread::~MyThread()
BaseThread::~CBaseThread()
=== jhluroom finish _^_ ===