【设计模式】行为型模式-Template模式

功能

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

解决

  • 主要解决:一些方法通用,却在每一个子类都重新写了这一方法
  • 何时使用:有一些通用的方法
  • 如何解决:将这些通用算法抽象出来
  • 关键代码:在抽象类实现,其他步骤在子类实现

优缺点

  • 优点:
    • 封装不变部分,扩展可变部分
    • 提取公共代码,便于维护
    • 行为由父类控制,子类实现
  • 缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

应用场景

  • 应用实例:
    • 在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异
    • spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等
  • 使用场景:
    • 有多个子类共有的方法,且逻辑相同
    • 重要的、复杂的方法,可以考虑作为模板方法
  • 注意事项:为防止恶意操作,一般模板方法都加上 final 关键词

简单示例代码部分

Template.hpp

#ifndef _TEMPLATE_H_ 
#define _TEMPLATE_H_
#include <iostream>
using namespace std;
class AbstractClass{
public:
	virtual ~AbstractClass(){}
	void TemplateMethod(){
		this->PrimitiveOperation1();
		this->PrimitiveOperation2();
	}
protected:
	virtual void PrimitiveOperation1() = 0; 
	virtual void PrimitiveOperation2() = 0; 
	AbstractClass(){}
};

class ConcreteClass1:public AbstractClass {
public:
	ConcreteClass1(){}
	~ConcreteClass1(){} 
protected:
	void PrimitiveOperation1(){
		cout<<"ConcreteClass1...PrimitiveOperation1"<<endl;
	}
	void PrimitiveOperation2(){
		cout<<"ConcreteClass1...PrimitiveOperation2"<<endl;
	}
};

class ConcreteClass2:public AbstractClass {
public:
	ConcreteClass2(){}
	~ConcreteClass2(){}
protected:
	void PrimitiveOperation1(){
		cout<<"ConcreteClass1...PrimitiveOperation2"<<endl;
	}
	void PrimitiveOperation2(){
		cout<<"ConcreteClass2...PrimitiveOperation2"<<endl;
	}
};
#endif

main.cpp

#include "Template.h"
#include <iostream>
using namespace std;
int main() {
	AbstractClass* p1 = new ConcreteClass1(); 
	AbstractClass* p2 = new ConcreteClass2();
	p1->TemplateMethod(); 
	p2->TemplateMethod(); 
	return 0;
}
发布了64 篇原创文章 · 获赞 3 · 访问量 6213

猜你喜欢

转载自blog.csdn.net/qazsatan/article/details/104270316