行为型模式之模板方法模式(TemplateMethod)

1. 意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2. 动机

在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用过程中,对架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作pdf)。我们抽取他们的共同点:这些操作的固定顺序,把他放到我们的父类里;他们的变化点:这些个具体的操作,去留给不同的子类去实现。这个就是模板方法模式,他定义一个操作中的算法的骨架(例子中的固定的操作顺序),而将一些步骤延迟到子类中(例子中的多种压缩文件的解压缩)。

Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。是一种比较简单的设计模式,但却是代码复用的一项基本技术,在类库中尤其重要,使用的也比较普遍。

3.结构

• A b s t r a c t C l a s s(抽象类,如A p p l i c a t i o n)
— 定义抽象的原语操作( primitive operation),具体的子类将重定义它们以实现一个算法的各步骤。

— 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在A b s t r a c t C l a s s或其他对象中的操作。
• C o n c r e t e C l a s s(具体类,如M y A p p l i c a t i o n)
— 实现原语操作以完成算法中与特定子类相关的步骤。


4.举例

#ifndef TEMMTD
#define TEMMTD
#include <iostream>
using std::cout;
using std::endl;
class Vehicle{
public:
	virtual void StartUp(){
		cout<<"Start Up ";
	}
	virtual void Drive(){
		cout<<"Drive the ";
	}
};
class Car : public Vehicle{
public:
	virtual void StartUp(){
		Vehicle::StartUp();
		ShowName();
	}
	virtual void Drive(){
		Vehicle::Drive();
		ShowName();
	}
	void ShowName(){
		cout<<"the car."<<endl;
	}
};
class Bus : public Vehicle{
public:
	virtual void StartUp(){
		Vehicle::StartUp();
		ShowName();
	}
	virtual void Drive(){
		Vehicle::Drive();
		ShowName();
	}
	void ShowName(){
		cout<<"the bus."<<endl;
	}
};
#endif


#include "TemplateMethod.h"
int main(){
	Vehicle* pVehA=new Car;
	Vehicle* pVehB=new Bus;
	pVehA->Drive();
	pVehA->StartUp();
	pVehB->Drive();
	pVehB->StartUp();
	delete pVehA;
	delete pVehB;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值