原型模式和模板方法模式(C++)

  原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  其中心思想就是克隆。举个例子,我们经常性需要复印身份证复印件,有时需要几张,其实就是克隆,关于代码和UML类图,我就不再多描述了,因为这个太简单了,就是定义一个拷贝构造函数,定义一个clone函数,在clone里面new this指针就可以了。

  我还是主要记录下模板方法模式吧,感觉这个还是蛮有意思的。

  模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。

  举个例子,我们在开发中,经常需要写DD,也就是详细设计,一般项目组都会有标准的模板,假如这个模板由模块描述、模块组成、接口设计、流程图这四个部分组成(现实生活中可能不一样,会有更多内容,这里仅仅假设,是为了表达模板方法模式的思想)。一个软件系统一般都是由很多模块组成的,每个都需要写DD,那我们只需要按模板,将自己模块的东西填写进去就可以,然后提交就OK。如果这个需要我们用C++实现,那我们该怎么实现那?

  我们可以设置一个模板基类,定义模块描述、模块组成、接口设计、流程图这四个虚函数,再在基类中定义一个不是虚函数,名字提交的函数,每个模块去继承这个基类,并实现自己的模块描述、模块组成、接口设计、流程图这个四个部分就可以了,我们调用就用基类去new对应的模块类,调用基类的提交函数就是实现了。假如我们现在有pwer和network两个模块需要写DD,那其UML类图如下所示:

也许上面的UML类图还不够直观,我们在看看代码也许就明白了:

#include <iostream>
using namespace std;

class BaseTemplate
{
protected:
    virtual void moduleDescription(){} ; //模块描述
    virtual void moduleComposition(){}; //模块组成
    virtual void interfaceDesign() {};      //接口设计
    virtual void flowChart(){};          //流程图
public:
    void submit()
    {
        moduleDescription();
        moduleComposition();
        interfaceDesign();
        flowChart();
    }
};

class Network : public BaseTemplate
{
protected:
    virtual void moduleDescription() //模块描述
    {
        cout<<" Network moduleDescription() "<<endl;
    }  
    virtual void moduleComposition()//模块组成
    {
        cout<<" Network moduleComposition() "<<endl;
    }; 
    virtual void interfaceDesign() //接口设计
    {
        cout<<" Network interfaceDesign() "<<endl;
    };      
    virtual void flowChart() //流程图
    {
        cout<<" Network flowChart() "<<endl;
    };          
};

class Power : public BaseTemplate
{
public:
    virtual void moduleDescription() //模块描述
    {
        cout<<" Power moduleDescription() "<<endl;
    }  
    virtual void moduleComposition()//模块组成
    {
        cout<<" Power moduleComposition() "<<endl;
    }; 
    virtual void interfaceDesign() //接口设计
    {
        cout<<" Power interfaceDesign() "<<endl;
    };      
    virtual void flowChart() //流程图
    {
        cout<<" Power flowChart() "<<endl;
    };          
};


int main(int argc,char** argv)
{
    BaseTemplate* moduleA = new Network();
    moduleA->submit();

    BaseTemplate* moduleB = new Power();
    moduleB->submit();
    delete moduleA, moduleB;

    return 0;
}

输出接口如下:

   每种设计模式,每次学习时,都有"温故而知新"的感觉,那我们就多多温故,多多知新吧,因为学无止境.........................

posted @ 2018-01-28 15:24  1点er执着  阅读(395)  评论(0编辑  收藏  举报