设计模式 模板方法模式

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 _^_ ===


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值