首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式——模板方法

设计模式——模板方法

原创
作者头像
火烧龙
发布2022-09-03 11:21:39
发布2022-09-03 11:21:39
4530
举报
文章被收录于专栏:问答设计模式问答设计模式

菜鸟:大家伙儿常说的模板方法是什么?

码农:设计模式的经典名著中Design Patterns: Elements of Reusable Object-Oriented Software(《设计模式——可复用面向对象软件的基础》)提出的一种软件编码思想模式。

菜鸟:嗯...什么样的思想模式?

码农:生活中有炒过菜吗?

菜鸟:嗯...有...

码农:做空心菜是不是有个固定的步骤?

菜鸟:嗯...是的呀。

码农:是不是要起锅倒油,热锅烧油,加入备菜,翻炒,加入调料,菜品出锅。

菜鸟:是的...

码农:如果是炒油麦菜呢?是不是步骤一样,油加热程度不同,备菜不同,调料不同而已。

菜鸟:嗯..好像是...

码农:做菜是不是有固定的流程和做不同菜的具体细节差异。

菜鸟:这跟模板方法有什么关系?

码农:模板方法就是来解决这个问题的;将完成一件事情的稳定和变化独立开来,定义好一个操作的算法骨架(稳定),而将一些步骤延迟到具体场景中实现(变化);模板方法使得不同场景复用同一个算法框架,具体的场景重定义算法的某些特定步骤。

菜鸟:有点...明白...

码农:不明白没关系看下具体的代码例子

定义好稳定部分

代码语言:c++
复制
#include <iostream>

// 程序基础服务开发人员代码
class library {
public:
	library(){}
	virtual ~library(){}

	// 定义并实现好稳定的三个步骤
	void step1() {
		//do something
		std::cout << "library step1" << std::endl;
	}
	void step3() {
		//do something
		std::cout << "library step3" << std::endl;
	}
	void step5() {
		//do something
		std::cout << "library step5" << std::endl;
	}

	virtual bool step2() = 0; // 纯虚函数要求子类必须要实现,给子类预留扩展,应对变化
	virtual bool step4() = 0; // 纯虚函数要求子类必须要实现,给子类预留扩展,应对变化

	
	// 定义好算法框架
	void run() {
		step1();
		if (step2()) {// 子类扩展变化
			step3();
		}
		for (size_t i = 0; i < 5; i++) {
			step4();// 子类扩展变化
		}
		step5();
	}
};

实现变化部分

代码语言:javascript
复制
// 上层应用逻辑程序代码
class application : public library {
public:
	application(){}
	virtual ~application(){}

	//重写父类方法 ,子类扩展变化
	virtual bool step2() {
		//do something
		std::cout << "application step2" << std::endl;
		return true;
	}
	//重写父类方法 ,子类扩展变化
	virtual bool step4() {
		//do something
		std::cout << "application step4" << std::endl;
		return true;
	}
};

使用模板方法

代码语言:javascript
复制
int main()
{
	//version 2
	// 应用程序不需要实现程序执行流程,调用定义好的run流程即可
	library* app = new application();
	app->run();
    delete app;

	return 0;
}

菜鸟:看了代码我终于明白了。

码农:小伙子有前途颇具慧根。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档