模板模式(Template Method)
动机
软件构建过程中,对于某一项任务,他常常有稳定的整体操作结构,但是各个子步骤却又有很多改变的需求,或者由于固定原因无法和任务的整体结构同时实现。
待解决问题
如何在确定稳定操作的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。
模板模式定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中,使得子类可以不改变(复用)一个算法的结构即可重新定义该算法的某些步骤。
—————— GoF
UML
图中抽象类AbstractClass中的TemplatesMethod一次性实现一个算法的骨架部分,而抽象方法PrimitiveOperation1和PrimitiveOperation2分别代表算法骨架中的两个易变步骤,这两个步骤在子类中给出具体实现。不同的子类给出不同的实现就形成了多个算法版本。
评价
优点:子类对抽象方法给出实现就拥有整个算法的功能。
缺点:算法骨架必须稳定,否则模板方法失效
例子:入学报到
入学报到有固定的流程,先被录取,然后缴费,确认,学校发送入学成功通知(稳定的骨架)。北京大学的录取通知方式是电话通知,而清华大学的是短信通知;北京大学的缴费方式是现金缴费,而清华大学是微信支付,北京大学签字确认,而清华大学网上确认(子步骤需求改变)。
tips:每个学校发送通知完成注册的方法是一样的,也就是子步骤需求没有发送改变,所以不用将其定义成虚方法延迟到子类实现其功能。
class School{//学校
public:
const void Entrance(){//入学流程
admit();//被录取了
pay();//支付学费
regist();//确认
finish();//学校发送通知完成注册
}
protected:
virtual void admit()=0;//录取
virtual void pay()=0;//支付学费
virtual void regist()=0;//完成注册:
void finish(){
//完成注册
}
};
class Peaking:School{//北京大学
void admit(){
//电话通知,你被北京大学录取了
}
void pay(){
//只能用现金支付学费
}
void regist(){
//去教务处签字完成注册
}
};
class TsingHua:School{//清华大学
void admit(){
//短信通知,你被清华大学录取了
}
void pay(){
//你可以用微信支付
}
void regist(){
//手机线上确认完成注册
}
};