引言
类的继承你一定用过,派生类覆写基类的方法你也一定用过,只是你可能不知道,这就是传说中的一种设计模式……
01
模板方法模式简介
模板方法模式是较简单且常用的一种设计模式,是基于类的继承的一种代码复用技术,其结构只存在基类和派生类之间的继承关系。模板方法是一个具体的方法,给出了一个顶层逻辑流程框架。
模板方法模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
02
模板方法模式结构
模板方法的结构很简单,只有基类和派生类两个角色:
模板方法模式的UML图如下:
模板方法模式的典型代码如下:
#ifndef __DEMO_H__
#define __DEMO_H__
// 抽象类(基类)
class AbstractClass
{
public:
// 模板方法,定义一个算法的框架流程
void templateMethod(){
// do something
method1();
method2();
method3();
}
// 基本方法——公共方法
void mehtod1(){
// do something
}
// 基本方法2
virtual void method2() = 0;
// 基本方法3——默认实现
void mehtod3(){
// do something
}
};
// 具体类(派生类)
class ConcreteClass :public AbstractClass
{
public:
// 实现基本方法2
void method2(){
// do something
}
// 重定义基本方法3,覆盖基类的方法3
void method3(){
// do something
}
};
#endif
03
模板方法模式代码实例
某个指纹处理模块可以在两种模式下处理算法,即安全模式和非安全模式。在安全模式下,为了保证数据安全,某个指纹识别流程需要对采得的指纹图像进行加密,在处理图像之前再对加密数据进行解密。而非安全模式这不需要加密解密过程。指纹算法流程如下:采图——加密——解密——算法处理指纹——处理结果。现用模板方法模式模拟上述过程。
在这个实例中,Jungle首先定义了基类FingerprintModule,声明了基本方法:采图getImage()、判断是否在安全模式isSafeMode()、加密encrypt()、解密decrypt()、处理指纹图像processImage()、输出结果output(),在基类中定义了一个模板方法algorithm(),该方法里定义了指纹算法流程。
从基类FingerprintModule派生出3个子类,分别是FingerprintModuleA、FingerprintModuleB和FingerprintModuleC,三个子类的特点在于:
该实例的UML图如下:
// 基类
class FingerprintModule
{
public:
FingerprintModule(){}
void getImage(){
printf("采指纹图像\n");
}
void output(){
printf("指纹图像处理完成!\n");
}
virtual bool isSafeMode() = 0;
virtual void processImage() = 0;
// 加解密
virtual void encrypt() = 0;
virtual void decrypt() = 0;
// 模板方法
void algorithm(){
// 1.采图
getImage();
// 2.安全模式下加密和解密
if (isSafeMode()){
// 2.1. 加密
encrypt();
// 2.2. 解密
decrypt();
}
// 3.处理Image
processImage();
// 4.处理结果
output();
}
};
3.2.派生类
// 派生类
class FingerprintModuleA :public FingerprintModule
{
public:
FingerprintModuleA(){}
void processImage(){
printf("使用 第一代版本算法 处理指纹图像\n");
}
bool isSafeMode(){
printf("安全模式\n");
return true;
}
void encrypt(){
printf("使用RSA密钥加密\n");
}
void decrypt(){
printf("使用RSA密钥解密\n");
}
};
// 派生类
class FingerprintModuleB :public FingerprintModule
{
public:
FingerprintModuleB(){}
void processImage(){
printf("使用 第二代版本算法 处理指纹图像\n");
}
bool isSafeMode(){
printf("非安全模式\n");
return false;
}
void encrypt(){}
void decrypt(){}
};
// 派生类
class FingerprintModuleC :public FingerprintModule
{
public:
FingerprintModuleC(){}
void processImage(){
printf("使用 第一代版本算法 处理指纹图像\n");
}
bool isSafeMode(){
printf("安全模式\n");
return true;
}
void encrypt(){
printf("使用DH密钥加密\n");
}
void decrypt(){
printf("使用DH密钥解密\n");
}
};
#include "FingerprintModule.h"
#include <Windows.h>
int main()
{
FingerprintModule *fp = new FingerprintModuleA();
fp->algorithm();
fp = new FingerprintModuleB();
fp->algorithm();
fp = new FingerprintModuleC();
fp->algorithm();
printf("\n\n");
system("pause");
return 0;
}
上述代码运行结果如下:
04
总结
模板方法模式是基于类的继承的一种设计模式,使用非常频繁,被广泛应用于框架设计。
优点:
缺点:
适用环境: