【设计模式】Template Method模式

曾经一同事指着一本《设计模式》对我说,你现在看这些还太早。自已也一直感觉这东西是挺高深,没有研究过。

近期在看《C++必知必会》,上面讲到Template Method模式,特别的亲切,这种模式我曾用过的。当时刚刚开始学着使用C++,设计了一些类,凭自已的感觉使用了多态性,让抽象类完成一些必要的初始化工作,并给某项工作制定一个流程,流程中每一项是一个虚函数,抽象类抽供一个非虚函数来调用这些虚函数,而每个虚函数都由派生类去完成。派生类只需要重写虚函数即可,不需要关心流程。事实证明这种方法有很好的扩展性。

设计模式到底是什么?

设计模式是一种架构也是一种思想,是为解决特定问题提供方案,并描述了这种解决方案的结果。模式关乎程序员之间的顺畅交流。确实是这样,我曾经还给人讲过我的设计,讲一大堆才说明白,今后再讲一句话即可:我使用的Template Method模式。这一下从小作坊式的设计上升到了一定的高度,哈哈。如果你还不懂这种模式,请向下看。

Template Method模式初识

基类定义一个操作中的算法骨架,而将一些步骤延迟到子类中。而子类不必关心算法,只需定义每个特定的步骤即可。

下面给个使用该模式的基类:

class App
{
public:
    App();
    virtual ~App();
    void startup() // 这个就是Template Method
    {
        initialize();
        if(!(validate()))
        {
            altInit();
        }
    }
protected:
    virtual bool validate() const; // 该函数交给子类去实现,基类可以实现也可以不实现
    virtual void altInit(); // 该函数交给子类去实现,基类可以实现也可以不实现
private:
    void initialize();
};

 那么继承于该父类的子类,就不需要关心流程了,因为父类通过Template Method已经对外宣称了。子类需要做的只是重写虚函数:

class MyApp: public App
{
public:
    MyApp();
    ~MyApp();

protected:
    bool validate() const
    {
        // do some thing by myself
        return true;
    }
    void altInit()
    {
        // do some thing by myself
    }
};

不同的子类具体的工作可以不同,但流程是一致的。

基类和派生类同心协力打造了一个完整的函数实现。

 

2011-12-14 任洪彩 [email protected]

欢迎指正。

你可能感兴趣的:(设计模式,c/c++)