Oh yeah, 看到这个模式的时候,我很happy~因为我发现我居然在之前的编程中用过,而且是自己想出来的设计方式,很有成就感,哈哈。

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的中的某些步骤。

从模板方法模式的定义中,我们就可以明确这个模式的实现方式了,即构造一个有算法骨架的基类,当你需要使用这个骨架的时候,继承该基类,并实现一些算法的细节。换句话说,基类定义了整个算法的框架。并实现某些通用的算法,使得需要这个框架的一些类不需要重新设计。

举个例子(刚刚我提到的那个自己的设计,在这里做了一些修改),你需要编写一个测试工具来测试几个相似但又不相同的程序。那么你如何来设计这个测试软件呢?

首先,你会很自然的想到要写几个类分别测试这几个程序,但是你突然发现,这几个程序不是相似嘛,测试流程应该也是类似,你在纸上画着,测试需要这么几个步骤:配置测试环境(包括设置测试参数,整理待测文件,验证环境的正确性),生成测试文件,开始测试。

接下来,你发现后面的两个步骤都是一样的,只是环境有区别,于是你设计出这么一个抽象类:

class Tester
{
private:
    std::string variables;
public:
    // setEnvironment 函数通过修改env变量来修改环境参数。
    virtual void setEnvironment(std::string& env) = 0;
    // 根据环境来生成测试文件
    void generateConfig(const std::string& vars) {
        std::cout << "Generating the Configuration files using the " << vars << "." << std::endl;
    }
    // 开始测试
    void startTest() {
        std::cout << "Starting the test..." << std::endl;
    }
    // 运行测试。
    void run() {
        setEnvironment(variables);
        generateConfig(variables);
        startTest();
        std::cout << "end..." << std::endl;
    }
};

看起来很不错,只需要子类实现环境的设置就可以了,子类实现环境的设置算法,甚至可以影响到框架的其他方法(请看generateConfig 方法就会被更改)!

这个能改变框架算法流程的方法称为“钩子”。它允许子类实现钩子来控制部分算法流程。

下面我们来看看子类的实现:

class Tester1 : public Tester
{
public:
    // 修改环境为 "environment 1"
    void setEnvironment(std::string& env) {
        env = "environment 1";
    }
};
class Tester2 : public Tester
{
public:
    // 修改环境为 "environment 2"
    void setEnvironment(std::string& env) {
        env = "environment 2";
    }
};

子类只需要实现部分算法就能享有父类的整套算法流程,是不是很HI呀~

下面来测试一下:

int main() {
    // 运行环境1的测试
    std::cout << "new a Tester1..." << std::endl;
    Tester* t = new Tester1();
    t->run();
    delete t;
    // 运行环境2的测试
    std::cout << "new a Tester2..." << std::endl;
    t = new Tester2();
    t->run();
    delete t;
    return 0;
}

结果如下:

new a Tester1...

Generating the Configuration files using the environment 1.

Starting the test...

end...

new a Tester2...

Generating the Configuration files using the environment 2.

Starting the test...

end...

这样,可以很方便的使基类指针指向不同的子类,就能够实现不同的测试方案了,很是方便。

posted on 2011-02-19 13:26  Tankery  阅读(262)  评论(0编辑  收藏  举报