c++设计模式----模板方法template method

本文介绍了模板方法设计模式的概念及应用场景,通过一个简单的C++代码示例展示了如何使用模板方法模式来实现算法的骨架,同时允许子类在不改变整体结构的情况下重定义特定步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板方法:

         模板方法很好理解,说白了就是一个模板,往这个模板中添加内容就可以了,比如公司给每个应聘的人都发了一个简历模板,大家只需要在简历模板中按照条目填写自己的资料就可以了,大家所以填写的条目一样,而内容是根据自己的情况填写的,这就是模板。

          在设计模式中,模板方法的意图是这样的定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用性:

              一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

             各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke 和Johnson 所描述过的“重分解以一般化”的一个很好的例子[ OJ93 ]。首先识别现              有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

              控制子类扩展。模板方法只在特定点调用“hook ”操作(参见效果一节),这样就只允许在这些点进行扩展。

                                                                                         clip_image014


#include <iostream>
using namespace std;

class AbstractClass
{
public:
	void TemplateMethod()
	{
		PrimitiveOperation1();
		cout << "TemplateMethod" << endl;
		PrimitiveOperation2();
	}

protected:
	virtual void PrimitiveOperation1()
	{
		cout << "Default Operation1" << endl;
	}

	virtual void PrimitiveOperation2()
	{
		cout << "Default Operation2" << endl;
	}
};

class ConcreteClassA : public AbstractClass
{
protected:
	virtual void PrimitiveOperation1()
	{
		cout << "ConcreteA Operation1" << endl;
	}

	virtual void PrimitiveOperation2()
	{
		cout << "ConcreteA Operation2" << endl;
	}
};

class ConcreteClassB : public AbstractClass
{
protected:
	virtual void PrimitiveOperation1()
	{
		cout << "ConcreteB Operation1" << endl;
	}

	virtual void PrimitiveOperation2()
	{
		cout << "ConcreteB Operation2" << endl;
	}
};

int main()
{
	AbstractClass *pAbstractA = new ConcreteClassA;
	pAbstractA->TemplateMethod();

	AbstractClass *pAbstractB = new ConcreteClassB;
	pAbstractB->TemplateMethod();

	if (pAbstractA) delete pAbstractA;
	if (pAbstractB) delete pAbstractB;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值