您的位置:首页 > 其它

【设计模式学习笔记二十四】【行为模式】【模板方法(Template Method)】

2015-02-10 13:11 621 查看
本文是学习刘伟技术博客和《设计模式-可复用面向对象软件的基础》笔记,博客链接:/article/1610242.html

主要是对博客和书本做提炼和记录,更多是对设计模式的基础框架学习,细节将略去,侧重对每个设计模式框架的理解。

我应该理解和掌握的:

1)能够画出这个设计模式的架构框图;

2)能够根据架构框图写出对应的伪代码;

3)这个模式的应用场景,主要优缺点。


1.模板方法

对于一个执行过程有固定的步骤,比如第一步执行什么,第二步做什么,第三步干什么,这些都是设计好的。在模板方法中,将实现功能的每一个步骤所对应的方法称为基本方法,而调用这些基本方法的同时定义基本方法的执行次序的方法称为模板方法。模板方法中,将相同的代码放在父类。把不需要改变的步骤可以放在父类实现,把需要改变的步骤交给子类实现。他是一种基于继承的代码复用技术。


(1)定义

模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


1) 模板方法结构图




2) 参与者

a)AbstractClass(抽象类):定义一系列的基本操作,可以是具体的,也可以是抽象的。每一个基本操作应该对应一个步骤,其子类可以重定义或实现这些步骤。实现一个模板方法,用于定义一个算法的骨架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用子类中实现的基本方法。
b)ConcreteClass(具体子类):实现父类中声明的抽象基本操作以完成子类特定算法步骤。


3) 看图写代码

/*
** FileName     : TemplatePattern
** Author       : lin005
** Date         : 2015/02/10
** Description  : More information, please go to http://blog.csdn.net/amd123456789 */
#include<iostream>
using namespace std;
//抽象类
class AbstractClass
{
public:
	//算法架构
	void TemplateMethod()
	{
		PrimitiveOperation1();
		PrimitiveOperation2();
	}
protected:
	//实现算法的一部分
	virtual void PrimitiveOperation1()
	{
		cout<<"Default Operation1"<<endl;
	}
	//实现算法的一部分
	virtual void PrimitiveOperation2()
	{
		cout<<"Default Operation2"<<endl;
	}
};
//具体类A,重写其中父类算法
class ConcreteClassA : public AbstractClass
{
protected:
	virtual void PrimitiveOperation1()
	{
		cout<<"A PrimitiveOperatioin1"<<endl;
	}
	virtual void PrimitiveOperation2()
	{
		cout<<"A PrimitiveOperatioin1"<<endl;
	}
};
//具体类B,重写其中父类算法
class ConcreteClassB : public AbstractClass
{
protected:
	virtual void PrimitiveOperation1()
	{
		cout<<"B PrimitiveOperatioin1"<<endl;
	}
	virtual void PrimitiveOperation2()
	{
		cout<<"B PrimitiveOperatioin1"<<endl;
	}
};
//客户端测试
#define SAFE_DELETE(p) if(p){delete p; p = NULL;}
int main()
{
	//创建一个具体对象A
	AbstractClass* a = new ConcreteClassA();
	a->TemplateMethod();
	//创建一个具体对象B
	AbstractClass* b = new ConcreteClassB();
	b->TemplateMethod();
	SAFE_DELETE(a);
	SAFE_DELETE(b);
	return 0;
}



(2)总结


1) 优点

a)在父类定义一个算法,由他的子类实现细节的处理,子类实现详细的处理并不会改变算法中步骤的执行次序。
b)模板方法是一种代码复用的基本技术;在类库中尤为重要,他们提取了类库中的公共行为。将公共行为放在父类中,而通过子类来实现不同的行为,他鼓励我们通过恰当使用继承来实现代码复用。
c)可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一步骤是否需要执行。


2) 缺点

a) 需要为每一个基本方法的不同实现提供一个子类,如果父类可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象。


(3)适用场景

1) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

2) 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的方向控制。

3) 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即:一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐