模板方法: 定义一个操作中的算法骨架(稳定),而将一些步骤延迟(变化)到子类中.
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();
}
C++11中的TemplateMethod示例:线程与算法骨架
本文介绍了如何在C++11中使用TemplateMethod模式,以MyThread类为例,展示了如何定义算法骨架并将可变部分延迟到子类UseMyThread中。QThread的简化实现展示了该模式的应用。

被折叠的 条评论
为什么被折叠?



