天天看点

C++设计模式--模板方法

1、含义概要

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。

Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。

2、源码实例

原始源码:

class Library {
public:
	void Step1() {
		//.....
		cout <<"Step1" << endl;
	}

	void Step3() {
		//.....
		cout << "Step3" << endl;
	}

	void Step5() {
		//.....
		cout << "Step5" << endl;
	}
};


class Application {
public:
	bool Step2()
	{
		//...
		cout << "Step2" << endl;
		return true;
	}

	bool Step4()
	{
		//...
		cout << "Step4" << endl;
		return true;
	}
};

int main()
{
	Library lib;
	Application app;

	lib.Step1();

	if (app.Step2())
	{
		lib.Step3();
	}

	for (int i = 0; i < 4; i++)
	{
		app.Step4();
	}

	lib.Step5();

	getchar();
	return 0;
}
           

改良源码:前提条件是Run是稳定的

class Library {
public:
	//稳定template method
	void Run()
	{
		Step1();

		if (Step2())
		{
			Step3();    //支持变化==》虚函数的多态调用
		}

		for (int i = 0; i < 4; i++)
		{
			Step4();     //支持变化==》虚函数的多态调用
		}

		Step5();
	}

	virtual ~Library() { };

protected:
	void Step1() {
		//.....
		cout <<"Step1" << endl;
	}

	void Step3() {
		//.....
		cout << "Step3" << endl;
	}

	void Step5() {
		//.....
		cout << "Step5" << endl;
	}

	virtual bool Step2() = 0; //变化
	virtual bool Step4() = 0; //变化
};


class Application :public Library {

protected:
	bool Step2()
	{
		//...子类重写实现
		cout << "Step2" << endl;
		return true;
	}

	bool Step4()
	{
		//...子类重写实现
		cout << "Step4" << endl;
		return true;
	}
};

int main()
{
	Library* pLib = new Application();
	pLib->Run();

	getchar();
	return 0;
}
           

3、要点小结

(1)Template Method模式是一种非常基础的设计模式,在面向对象系统中有大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

(2)除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

(3)在具体实现方面,被Template Method调用的虚方法可以有实现,有可以没有任何实现(抽象方法、纯虚方法),但一般把它们设置为protected方法。

继续阅读