设计模式笔记-Template模式

模板模式,逻辑很清晰,容易实现,用的也多!需求情景就是:对一个业务逻辑/算法实现,在不同对象中有不同的细节实现,但是逻辑的框架是相同的!就是说它们的操作步骤/接口是相同的,以继承的方式实现!看下图UML就明白了:到公司应聘,公司给每人发一个简历表,让大家填,而不是直接用每个人自己带的简历!

有几点:

1. 将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节! 这和Strategy模式不同,后者是将逻辑封装到一个类中,采取组合的方式解决这个问题!见后一篇!

2. 上图中FillResume()函数里实现的就是逻辑的框架,其中肯定调用了三个SetXxx函数!

3. 三个SetXxx()函数都是protect成员, 经public继承后都只提供给模板方法调用,单独对外开放没实际意义!

上面这种设计原则被称为依赖倒置(DIP, Dependency Inversion Principles):父类调用子类的操作,子类接口实现父类声明的接口!控制权在父类,子类反而要依赖高层模块!

模板模式的缺点:假设有另一个Resume抽象基类的变体AnotherResume,它们通用算法不一样,但SetXxx实现有些是一样的,想复用Resume子类的具体算法实现就不可能了,因为人家细节实现是靠继承完成的,它没有继承Resume。 这个问题,也可以通过Strategy模式的组合方式解决!

//简历
class Resume
{
protected: //保护成员
	virtual void SetPersonalInfo() {}
	virtual void SetEducation() {}
	virtual void SetWorkExp() {}
public:
	void FillResume() 
	{
		SetPersonalInfo();
		SetEducation();
		SetWorkExp();
	}
};
class ResumeA: public Resume
{
protected:
	void SetPersonalInfo() { cout<<"A's PersonalInfo"<<endl; }
	void SetEducation() { cout<<"A's Education"<<endl; }
	void SetWorkExp() { cout<<"A's Work Experience"<<endl; }
};
class ResumeB: public Resume
{
protected:
	void SetPersonalInfo() { cout<<"B's PersonalInfo"<<endl; }
	void SetEducation() { cout<<"B's Education"<<endl; }
	void SetWorkExp() { cout<<"B's Work Experience"<<endl; }
};
int main()
{
	Resume *r1;
	r1 = new ResumeA();
	r1->FillResume();
	delete r1;
	r1 = new ResumeB();
	r1->FillResume();
	delete r1;
	r1 = NULL;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值