设计模式——模板方法

2022-09-03 11:21:39 浏览数 (1)

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

码农:设计模式的经典名著中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;
}

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

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

0 人点赞