模版方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类,可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
实例
main.cc:
#include <windows.h>
#include "zhangsan_runner.h"
#include "lisi_runner.h"
/*
design_pattern:"template_method"
The team needs to test the physical ability of the students,the exam contain 3 items:
swimming
bike
running
*/
int main(){
Runner *zhangsan = new ZhangsanRunner();
Runner *lisi = new LisiRunner();
zhangsan->Exam();
lisi->Exam();
//clear
delete zhangsan;
delete lisi;
system("Pause");
return 0;
}
Runner:
//runner.h
#ifndef HELENDP_SOURCE_RUNNER_H_
#define HELENDP_SOURCE_RUNNER_H_
#include <string>
using namespace std;
class Runner{
public:
Runner();
virtual ~Runner();
void Exam();
virtual void Swim();
virtual void Bike();
virtual void Run();
};
#endif
//runner.cc
#include "runner.h"
Runner::Runner(){
}
Runner::~Runner(){
}
void Runner::Swim(){
}
void Runner::Bike(){
}
void Runner::Run(){
}
void Runner::Exam(){
Swim();
Bike();
Run();
}
LisiRunner:
//lisi_runner.h
#ifndef HELENDP_SOURCE_LISI_RUNNER_H_
#define HELENDP_SOURCE_LISI_RUNNER_H_
#include <string>
using namespace std;
#include "runner.h"
class LisiRunner : public Runner{
public:
LisiRunner();
virtual ~LisiRunner();
void Exam();
void Swim();
void Bike();
void Run();
private:
string name_;
};
#endif
//lisi_runner.cc
#include "lisi_runner.h"
#include <iostream>
using namespace std;
LisiRunner::LisiRunner(){
}
LisiRunner::~LisiRunner(){
}
void LisiRunner::Swim(){
cout << "lisi swim!" << endl;
}
void LisiRunner::Bike(){
cout << "lisi bike!" << endl;
}
void LisiRunner::Run(){
cout << "lisi run!" << endl;
}
ZhangsanRunner:
//zhangsan_runner.h
#ifndef HELENDP_SOURCE_ZHANGSAN_RUNNER_H_
#define HELENDP_SOURCE_ZHANGSAN_RUNNER_H_
#include <string>
using namespace std;
#include "runner.h"
class ZhangsanRunner : public Runner{
public:
ZhangsanRunner();
virtual ~ZhangsanRunner();
void Exam();
void Swim();
void Bike();
void Run();
private:
string name_;
};
#endif
//zhangsan_runner.cc
#include "zhangsan_runner.h"
#include <iostream>
using namespace std;
ZhangsanRunner::ZhangsanRunner(){
}
ZhangsanRunner::~ZhangsanRunner(){
}
void ZhangsanRunner::Swim(){
cout << "zhangsan swim!" << endl;
}
void ZhangsanRunner::Bike(){
cout << "zhangsan bike!" << endl;
}
void ZhangsanRunner::Run(){
cout << "zhangsan run!" << endl;
}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- AbstractClass(Runner):模版方法的抽象类.
- ConcreteClass(LisiRunner,ZhangsanRunner):模版方法的具体类.
优点
- 模板方法模式在定义了一组算法,将具体的实现交由子类负责.
- 模板方法模式是一种代码复用的基本技术.
- 模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”.
缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,是的系统更加庞大.