模板方法: 定义一个操作中的算法骨架(稳定),而将一些步骤延迟(变化)到子类中.
UML关系类图
Template Method使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
这里的 MyThread 是效仿 Qt4 的QThread做的简单的实现(这里仅仅只是为了展示template method的用法,QThread实际实现要比这复杂),start函数内部的线程创建与使用作为Template Method固定不变的部分,而将线程需要做的工作放到子类UseMyThread中去进行延时实现。
C++ 11代码: mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
///
/// \brief The MyThread class
/// 模板方法
/// 定义一个操作中的算法骨架(稳定),而将一些步骤延迟(变化)到子类中.
/// Template Method使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
///
#include <thread>
#include <iostream>
class MyThread
{
public:
MyThread();
virtual ~MyThread();
void start();
virtual void run();
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
MyThread::MyThread()
{
}
MyThread::~MyThread()
{
}
void MyThread::start()
{
std::thread thread([&](){
run();
});
thread.join();
}
void MyThread::run()
{
std::cout << "MyThread::run " << std::this_thread::get_id() << std::endl;
//虚函数接口实现,但不做任何工作
}
usemythread.h
#ifndef USEMYTHREAD_H
#define USEMYTHREAD_H
#include "mythread.h"
class UseMyThread : public MyThread
{
public:
UseMyThread();
~UseMyThread();
virtual void run() override;
};
#endif // USEMYTHREAD_H
usemythread.cpp
#include "usemythread.h"
UseMyThread::UseMyThread()
{
}
UseMyThread::~UseMyThread()
{
}
void UseMyThread::run()
{
std::cout << "UseMyThread::run " << std::this_thread::get_id() << std::endl;
}
main.cpp
#include <QCoreApplication>
#include "usemythread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
UseMyThread thread;
thread.start();
std::cout << "main " << std::this_thread::get_id() << std::endl;
return a.exec();
}