第10章模板方法模式
一 概念
- 模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
二 UML图
- AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
- ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
三 模板方法模式的特点
- 模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
- 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
四 C++代码实现
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
class TestPaper
{
public:
void TestQuestion1()
{
cout << "\n杨过得到,后来给了郭靖,练成了倚天剑,屠龙刀的玄铁可能是[ ]"
<< "a.球磨铸铁"
<< "b. 马口铁"
<< "c. 高速合金钢"
<< "d. 碳素纤维";
cout << "答案: "
<< this->Answer1();
}
void TestQuestion2()
{
cout << "\n杨过、程英、陆无双铲除了情花,造成[ ]"
<< "a.这种植物不在害人"
<< "b.使一种珍稀物种灭绝"
<< "c.破坏了那个生态圈的生态平衡"
<< "d. 造成该地区沙漠化";
cout << "答案: "
<< this->Answer1();
}
void TestQuestion3()
{
cout << "\n蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[ ]"
<< "a.阿司匹林"
<< "b.牛黄解毒片"
<< "c.氟哌酸"
<< "d.让他们喝大量的生牛奶"
<< "e.以上全不对";
cout << "答案: "
<< this->Answer1();
}
protected:
virtual string Answer1()
{
return "";
}
virtual string Answer2()
{
return "";
}
virtual string Answer3()
{
return "";
}
};
//学生甲抄的试卷
class TestPaperA : public TestPaper
{
protected:
string Answer1() override
{
return "c";
}
string Answer2() override
{
return "d";
}
string Answer3() override
{
return "c";
}
};
class TestPaperB : public TestPaper
{
protected:
string Answer1() override
{
return "c";
}
string Answer2() override
{
return "a";
}
string Answer3() override
{
return "e";
}
};
int main()
{
cout << "学生甲抄的试卷:" << endl;
//将子类变量的声明改成了父类,利用了多态性,实现了代码的复用
TestPaper* studentA = new TestPaperA();
studentA->TestQuestion1();
studentA->TestQuestion2();
studentA->TestQuestion3();
cout << "\n学生乙抄的试卷:" << endl;
TestPaper* studentB = new TestPaperB();
studentB->TestQuestion1();
studentB->TestQuestion2();
studentB->TestQuestion3();
return 0;
}