1、模板方法模式的定义
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2、模板方法模式的类图结构
3、模式的优缺点及适用情况
模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码,从而提供了一个很好的代码复用平台。有时候,我们会遇到有一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。这个时候我们通常就应该考虑用模板方法模式。
4、应用举例
例如有一家专业生产饲料的工厂,他们同时能接收生产猪饲料和狗粮的订单进行生产。虽然对于养猪场厂长和家庭铲屎官来说,猪饲料和狗粮相差十万八千里,但是对于饲料厂来说,可能差别就没那么大了。单从生产饲料的流程上来说,每一种饲料的生产过程都大致分为配料、搅拌、制饼、大包装袋四个过程。只不过具体细节会因为生产对象的不同而有所差异而已。这种总体步骤一致,只是具体因为子类的不同而有所差异的情况就可用模板方法模式来实现。其类图和代码如下:
#include<iostream>
using namespace std;
class Feed{
public:
void productionProcess();
virtual void mixIngredients() = 0;
void mix() ;
void form() ;
void pack();
};
void Feed::productionProcess(){
mixIngredients();
mix();
form();
pack();
}
void Feed::mix(){
cout<<"猪饲料狗饲料反正都是搅一搅!"<<endl;
}
void Feed::form(){
cout<<"猪饲料狗饲料反正都是做成饼!"<<endl;
}
void Feed::pack(){
cout<<"猪饲料狗饲料反正都是装成袋!"<<endl;
}
class PigFeed:public Feed{
public:
virtual void mixIngredients();
};
void PigFeed::mixIngredients(){
cout<<"玉米加红薯,成就专业小猪饲料!"<<endl;
}
class DogFeed:public Feed{
public:
virtual void mixIngredients();
};
void DogFeed::mixIngredients(){
cout<<"牛肉加面粉,成就专业精品狗粮!"<<endl;
}
int main(){
Feed* feed1 = new PigFeed();
Feed* feed2 = new DogFeed();
feed1->productionProcess();
cout<<"************美味分隔符**************"<<endl;
feed2->productionProcess();
return 0;
}