设计模式--模版模式

1、引

  • 刚参加工作时,一大牛同事写了一个C++的下位机框架,今天突然又记起来了,里面用了好几个设计模式的方法,其中之一就是模板模式,还有单件模式。这里把模板模式记录一下。

2、定义

  • 在模板模式(Template Pattern)中,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。大牛的骨架就是消息执行的过程是定好的,但是每种消息模块的执行是不一样的。

3、UML图

这里写图片描述

4、C++实例

简化一下大牛的框架

class CMsgModule
{
public:
    void Algorithms();//算法骨架在这里定义
protected:
    virtual void loadMsg() = 0;
    virtual void exeMsg() = 0;
    virtual void afterExeMsg() = 0;
};
//消息的执行都经过这三步
void CMsgModule::Algorithms()
{
    loadMsg();
    exeMsg();
    afterExeMsg();
}

派生的具体消息模块

class CMsgModuleA :public CMsgModule
{
protected:
    virtual void loadMsg();
    virtual void exeMsg();
    virtual void afterExeMsg();
};

class CMsgModuleB :public CMsgModule
{
protected:
    virtual void loadMsg();
    virtual void exeMsg();
    virtual void afterExeMsg();
};

//每个具体的消息模块的具体接口都会有自己特定的算法

void CMsgModuleA::loadMsg()
{
    qDebug() << "Module A"<<" load msg";
}

void CMsgModuleA::exeMsg()
{
    qDebug() << "Module A"<<" exe msg";
}

void CMsgModuleA::afterExeMsg()
{
    qDebug() << "Module A"<<" after exe msg";
}


void CMsgModuleB::loadMsg()
{
    qDebug() << "Module B"<<" load msg";
}

void CMsgModuleB::exeMsg()
{
    qDebug() << "Module B"<<" exe msg";
}

void CMsgModuleB::afterExeMsg()
{
    qDebug() << "Module B"<<" after exe msg";
}

主循环里:

    QVector<CMsgModule* > vec ;
    vec << new CMsgModuleA;
    vec << new CMsgModuleB;

    for(int i = 0 ;i < vec.size();i++)
    {
        vec.at(i)->Algorithms();
    }

5、总结

1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
4、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

6、参考资料

https://www.tutorialspoint.com/design_pattern/template_pattern.htm
https://en.wikipedia.org/wiki/Template_method_pattern
http://www.oodesign.com/template-method-pattern.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值