设计模式之模板方法模型

设计模式——模板方法模型

1 定义

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

2 主要作用

​ 通过把不变行为抽象到父类,去除子类中的重复代码,并将具体内容延迟到子类中实现。也就是说,提供了一个代码复用平台,使得能够在不改变模板结构的前提下在子类中重新定义模板的内容

3 原理类图

设计模式之模板方法模型_第1张图片

4 实例

给出一个逻辑骨架(父类TemplateMethod),其组成是一些相应的抽象操作。而这些抽象操作分别在子类(ConcreteClassA、ConcreteClassB)中实现,代码如下

#ifndef _TEMPLATEMETHOD_H_
#define _TEMPLATEMETHOD_H_
#include 
using namespace std;
// 父类 给出逻辑的骨架 逻辑的组成是一些相应的抽象操作,推迟到子类实现
class TemplateMethod {
	public:
		TemplateMethod() {};
		~TemplateMethod();
		// 调用虚函数 而该虚函数在子类中实现
		void ExecuteSequence() {
			this->PrimitiveOperation1();
			this->PrimitiveOperation2();
			return;
		}

	protected:
    	// 声明纯虚函数 需要用子类实现
		virtual void PrimitiveOperation1() = 0;
		virtual void PrimitiveOperation2() = 0;
};
// 继承模板方法
class ConcreteClassA : public TemplateMethod {
	public:
		ConcreteClassA() {};
		~ConcreteClassA() {};
		virtual void PrimitiveOperation1() {
			cout << "函数A方法1" << endl;
		}

		virtual void PrimitiveOperation2() {
			cout << "函数A方法2" << endl;
		};
};
// 继承模板方法
class ConcreteClassB : public TemplateMethod {
	public:
		ConcreteClassB() {};
		~ConcreteClassB() {};
		virtual void PrimitiveOperation1() {
			cout << "函数B方法1" << endl;
		};
		virtual void PrimitiveOperation2() {
			cout << "函数B方法2" << endl;
		};
};

#endif
#include 
#include "TemplateMethod.h"
using namespace std;

int main()
{	
    // 多态
	TemplateMethod *a = new ConcreteClassA();
	TemplateMethod *b = new ConcreteClassB();
	a->ExecuteSequence();
	b->ExecuteSequence();
	return 0;
}

5 解决的问题

  • 提高代码的复用性

    将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。

  • 实现了反向控制(后绑定)

    通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制同时符合“开闭原则”。

6 优点缺点

  • 优点
    • 提高代码复用性——封装不变部分
    • 提高代码拓展性——扩展可变部分
    • 实现了反向控制
  • 缺点
    • 不同的实现都需要定义一个子类,导致类的个数增加,系统庞大。同时设计更抽象,间接增加了系统实现的复杂度
    • 反向控制结构使得代码的阅读难度提高了
    • 由于继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍(重新实现)。

7 应用场景

  • 算法整体步骤固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 为了避免代码重复,各子类中公共的行为应被提取出来并集中到一个公共父类中;
  • 控制子类的扩展

8 总结

​ 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。可通过模板方法模式把这些行为搬移到单一的地方,帮助子类摆脱重复不变行为的纠缠,以避免代码重复,提高代码扩展性。

你可能感兴趣的:(设计模式,设计模式,c++,算法)