模板模式是《大话设计模式》中比较简单的模型,书中一个做试卷的例子进行分析。总结来说,就是对于同一份试卷,有多个不同的测试者,那么他们试卷上不同的只是答案(以及姓名),而实体及输出格式都是一致的。所以在父类的方法中可以把所有相同的实现都写好,答案只需要调用子类不同的虚方法。下面是我用C++进行了实现。
#include <iostream>
using namespace std;
class Test
{
public:
void makeTest1();
virtual string getAnswer();
};
void Test::makeTest1()
{
cout<<"who is more beautiful?"<<endl;
cout<<"ans: "<<getAnswer()<<endl;
}
string Test::getAnswer()
{
return "";
}
class TestA:public Test
{
public:
virtual string getAnswer();
};
string TestA::getAnswer()
{
return "A";
}
class TestB : public Test
{
public:
// void makeTest1(); 不能写
virtual string getAnswer();
};
string TestB::getAnswer()
{
return "B";
}
int main(int argc, const char * argv[]) {
Test *t = new TestA(); //动态绑定,推迟到运行时
t->makeTest1();
t = new TestB();
t->makeTest1();
return 0;
}
上面代码中的getAnswer方法是虚函数,这也是C++面试中经常会问的知识点,这里简单回顾和总结一下C++的虚函数要注意的几点:
1. 利用了动态绑定,Test *t = new TestA();而不能TestA *t = new TestA();因为用后者既没有利用面向对象的动态绑定思想。
2. 虚函数必须使用指针调用!
3. 如果在子类中加 void makeTest1();但没有实现,而如果要想用子类的对象调用该方法会报错,因为编译器找不到子类中的定义!