模板方法模式与钩子

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

在这里插入图片描述

钩子:是一种被声明在抽象类中的方法,但只是空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。

作用:子类实现算法的可选部分、子类可以对钩子不理会、子类可以对某些即将发生或刚刚发生的步骤做出反应(比如重新排序、新的赋值、显示等等)、子类为其抽象类做一些决定。

代码:

Template.h:

#pragma once
#include <iostream>
using namespace std;
class Template
{
public:
	virtual void A() = 0;
	virtual void B() = 0;
	void templateMethod()
	{
		if(useA()) A();
		if(useB()) B();
	}
	virtual bool useA()//钩子(是否调用A)
	{
		return true;
	}
	virtual bool useB()//钩子(是否调用B)
	{
		return true;
	}
};
class Template1:public Template
{
	virtual void A()
	{
		cout << "调用Template1的A方法" << endl;
	}
	virtual void B()
	{
		cout << "调用Template1的B方法" << endl;
	}
	virtual bool useA()
	{
		return false;
	}
};
class Template2 :public Template
{
	virtual void A()
	{
		cout << "调用Template2的A方法" << endl;
	}
	virtual void B()
	{
		cout << "调用Template2的B方法" << endl;
	}
	virtual bool useB()
	{
		return false;
	}
};
class Template3 :public Template
{
	virtual void A()
	{
		cout << "调用Template3的A方法" << endl;
	}
	virtual void B()
	{
		cout << "调用Template3的B方法" << endl;
	}
};



main.cpp

#include <iostream>
#include "Template.h"
using namespace std;


int main()
{
	Template1* t1 = new Template1;
	Template2* t2 = new Template2;
	Template3* t3 = new Template3;
	t1->templateMethod();
	t2->templateMethod();
	t3->templateMethod();
	return 0;
}

结果:

在这里插入图片描述


版权声明:本文为qq_40386321原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。