模板模式(Template Method)

模板模式(Template Method)

动机

软件构建过程中,对于某一项任务,他常常有稳定的整体操作结构,但是各个子步骤却又有很多改变的需求,或者由于固定原因无法和任务的整体结构同时实现。

待解决问题

如何在确定稳定操作的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。

模板模式定义

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中,使得子类可以不改变(复用)一个算法的结构即可重新定义该算法的某些步骤。
—————— GoF

UML

图中抽象类AbstractClass中的TemplatesMethod一次性实现一个算法的骨架部分,而抽象方法PrimitiveOperation1和PrimitiveOperation2分别代表算法骨架中的两个易变步骤,这两个步骤在子类中给出具体实现。不同的子类给出不同的实现就形成了多个算法版本。
模板模式UML图

评价

优点:子类对抽象方法给出实现就拥有整个算法的功能。
缺点:算法骨架必须稳定,否则模板方法失效

例子:入学报到

入学报到有固定的流程,先被录取,然后缴费,确认,学校发送入学成功通知(稳定的骨架)。北京大学的录取通知方式是电话通知,而清华大学的是短信通知;北京大学的缴费方式是现金缴费,而清华大学是微信支付,北京大学签字确认,而清华大学网上确认(子步骤需求改变)。

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(){
	//手机线上确认完成注册
	}
};	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值