设计模式实现(七)--- 模板方法模式(Template Method)

本文介绍模板方法模式的概念及其应用,通过实例演示如何使用模板方法模式减少代码重复,并保持算法结构不变的同时允许子类重新定义算法的某些步骤。

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

概述:

如果继承有意义,就应该要称为子类的模板,所有重复的代码都应该上升到父类中区,而不是让每个子类都一一重复。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可定重定义该算法的某些特定步骤。

模板方法的特点:
模板方法模式是通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。
当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。


模板方法模式原型实现

#include <stdio.h>
/*
AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,
它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
*/
class AbstractClass
{
public:
	//一些抽象方法,放到子类中去实现
	virtual void PrimitiveOperation1() = 0;
	virtual void PrimitiveOperation2() = 0;
public:
	//模板方法
	void TemplateMethod()
	{
		PrimitiveOperation1();
		PrimitiveOperation2();
	}
};
/*
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass
都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
*/
class ConcreteClassA : public AbstractClass
{
public:
	void PrimitiveOperation1()
	{
		printf("具体类A方法实现1\n");
	}
	void PrimitiveOperation2()
	{
		printf("具体类A方法实现2\n");
	}
};
class ConcreteClassB : public AbstractClass
{
public:
	void PrimitiveOperation1()
	{
		printf("具体类B方法实现1\n");
	}
	void PrimitiveOperation2()
	{
		printf("具体类B方法实现2\n");
	}
};

客户端
int main()
{
	AbstractClass *c;
	c = new ConcreteClassA();
	c->TemplateMethod();

	c = new ConcreteClassB();
	c->TemplateMethod();
	return 1;
}

模板方法模式例子

#include <stdio.h>
//一个抄题,答题程序
//AbstractClass
class Test
{
public:
	virtual char answer1() = 0;
	virtual char answer2() = 0;
public:
	virtual void TestQuestion1()
	{
		printf("第一题:1 + 3 = 【】 \n a.4 b.5 c.6 d.7 \n ");
		printf("答案:%c\n",answer1());
	}
	virtual void TestQuestion2()
	{
		printf("第二题:1 * 3 = 【】 \n a.3 b.5 c.6 d.7 \n ");
		printf("答案:%c\n",answer2());
	}
};
//ConcreteClass
class TestPaperA : public Test
{
public:
	char answer1()
	{
		return 'a';
	}
	char answer2()
	{
		return 'a';
	}
};
class TestPaperB : public Test
{
public:
	char answer1()
	{
		return 'b';
	}
	char answer2()
	{
		return 'c';
	}
};
//客户端
int main()
{
	Test *base;
	base = new TestPaperA();		//此处用父类指针
	base->TestQuestion1();
	base->TestQuestion2();

	base = new TestPaperB();		//此处用父类指针
	base->TestQuestion1();
	base->TestQuestion2();
	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值