模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
模板方法模式利用C++多态特征,在父类定义一套结构流程,其中通用部分在父类实现,子类继承父类实现差异性的接口。
模板方法模式是比较实用的一种设计模式,将不变部分的流程和接口在父类实现,变化部分的接口预留出来交由子类实现。如此,有利于代码的复用性、可扩展性。
一位头痛和一位胃疼的病人去医院看病。
现在有两位不同症状的病人去看病,可以自实现两套去不同科室的流程。假如10个、20个不同症状的病人,按照这种设计,代码工作量大不说还会存在大量的重复逻辑代码。遇到这种重复代码,就要想办法抽象。
编程环境
工程结构
TemplateMethod/
├── main.cc
├── Makefile
├── see_doctor.cc
└── see_doctor.h
看医生基类:
class CSeeDoctorTemplate
{
public:
CSeeDoctorTemplate();
~CSeeDoctorTemplate();
// 看病流程
virtual void StartProcess() final;
// 展示健康码
virtual void ShowHealthCode();
// 填写登记表
virtual void FillTable() = 0;
// 挂号
virtual void Register() = 0;
// 医生面诊
virtual void SeeDoctor();
// 付款
virtual void Pay();
public:
float mCost;
};
通用流程接口实现:
// 看病流程
void CSeeDoctorTemplate::StartProcess()
{
this->ShowHealthCode();
this->FillTable();
this->Register();
this->SeeDoctor();
this->Pay();
}
此基类定义出通用的流程和接口,子类只需要继承基类实现具体的接口即可。
class CTreatStomach : public CSeeDoctorTemplate
{
public:
CTreatStomach();
~CTreatStomach();
void FillTable();
void Register();
void SeeDoctor();
};
CTreatStomach继承CSeeDoctorTemplate,并实现具体有差异的几个接口即可。
int main(int argc, char *argv[])
{
shared_ptr<CSeeDoctorTemplate> p1(new CTreatStomach);
p1->StartProcess();
MAIN_LOG("\n\n");
shared_ptr<CSeeDoctorTemplate> p2(new CTreatHeadache);
p2->StartProcess();
return 0;
}
-------- Treat Stomach --------
Show health code!
Fill table: Stomach.
Register Internal Medicine.
See physician internist.
Pay the medical bills 230.90¥.
-------- Treat Headache --------
Show health code!
Fill table: Headache.
Register Surgery.
See surgeon.
Pay the medical bills 82.70¥.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。