所谓模板方法模式,就是在在抽象基类中定义一套算法框架,框架内的步骤由各个派生类去实现。模板方法模式的好处在于,具有相同代码的操作提升至抽象基类中,派生类中只实现具有差异性的代码,从而最大程度减少了重复代码的存在。要注意的是,这里的模板方法和C++中的模板函数没有任何关系。下面以一个用C++描写的简单示例来说明模板方法模式的机制。
#include <iostream>
#include <string>
using namespace std;
class Introduce {
public:
// 操作框架
void speak()
{
cout << "Hello everyone! My name is " << name() << ", I'm " << age() << " years old.\n";
}
protected:
// 根据不同的实例,由派生类进行重写
virtual string name() = 0;
virtual int age() = 0;
};
class IntroduceFoo : public Introduce {
virtual string name()
{
return string("Foo");
}
virtual int age()
{
return 18;
}
};
class IntroduceBar : public Introduce {
virtual string name()
{
return string("Bar");
}
virtual int age()
{
return 22;
}
};
int main()
{
Introduce *foo = new IntroduceFoo();
Introduce *bar = new IntroduceBar();
foo->speak();
bar->speak();
// 别忘了删除指针
delete foo;
delete bar;
system("pause");
return 0;
}
在这个例子中,我写了一个关于自我介绍的类。这里假设自我介绍的内容遵循同一个模板,那么内容中相同的部分是非常多的,差异也只在于姓名和年龄的不同。因此,我们把自我介绍的一大段文字提升到基类中,而名字、年龄则由各个派生类去实现。“特异性”凌驾于“不变性”,所以使用了虚函数。派生类中对虚函数的重写非常简单,只需要描述跟自己相关的信息即可。当有其他人需要自我介绍时,只需要继承Introduce抽象基类,返回自己的信息就可以了。模板已经在基类中搭好,剩下的扩充是非常灵活的。
参考:
《大话设计模式》第10章。
原文地址:http://blog.csdn.net/nestler/article/details/37809335