C++设计模式之模板方法模式
目录
1.设计目的
完成在某一细节层次一致的一个过程或一系列步骤,但个别步骤在更细节的层次上实现可能不同,我们就会采用模板方法模式.
2.设计UML
其中 void templateMethod() 函数顺序调用operation1()和operation2()方法.
3.代码实现
//.h文件
#ifndef TEMPLATEMETHODINTERFACE_H
#define TEMPLATEMETHODINTERFACE_H
/** *******************************************************
@brief :模板方法接口类
@author :
@date :
@version :v1.0
@copyright :Copyright (C) 2020 - All Rights Reserved
@warning :
@note
******************************************************** **/
class TemplateMethodInterface
{
public:
TemplateMethodInterface();
public:
virtual void operation1() = 0;
virtual void operation2() = 0;
virtual void templateMethod() = 0;
};
#endif // TEMPLATEMETHODINTERFACE_H
//.cpp文件
#include "TemplateMethodInterface.h"
TemplateMethodInterface::TemplateMethodInterface()
{
}
//.h文件
#ifndef TEMPLATEMETHODBASE_H
#define TEMPLATEMETHODBASE_H
#include "TemplateMethodInterface.h"
/** *******************************************************
@brief :模板方法基类
@author :
@date :
@version :v1.0
@copyright :Copyright (C) 2020 - All Rights Reserved
@warning :
@note
******************************************************** **/
class TemplateMethodBase : public TemplateMethodInterface
{
public:
TemplateMethodBase();
public:
virtual void operation1() = 0;
virtual void operation2() = 0;
virtual void templateMethod() override;
};
#endif // TEMPLATEMETHODBASE_H
//.cpp 文件
#include "TemplateMethodBase.h"
TemplateMethodBase::TemplateMethodBase()
{
}
void TemplateMethodBase::templateMethod()
{
operation1();
operation2();
}
//.h文件
#ifndef CONCRETECLASE_H
#define CONCRETECLASE_H
#include "TemplateMethodBase.h"
/** *******************************************************
@brief :具体细节实现A
@author :
@date :2020-03-26
@version :v1.0
@copyright :Copyright (C) 2020 - All Rights Reserved
@warning :
@note
******************************************************** **/
class ConcreteClaseA : public TemplateMethodBase
{
public:
ConcreteClaseA();
public:
virtual void operation1() override;
virtual void operation2() override;
};
#endif // CONCRETECLASE_H
//.cpp文件
#include "ConcreteClaseA.h"
#include <iostream>
using namespace std;
ConcreteClaseA::ConcreteClaseA()
{
std::cout << "ConcreteClassA" << endl;
}
void ConcreteClaseA::operation1()
{
std::cout << "ConcreteClaseA::operation1" << endl;
}
void ConcreteClaseA::operation2()
{
std::cout << "ConcreteClaseA::operation2" << endl;
}
//.h文件
#ifndef CONCRETECLASEB_H
#define CONCRETECLASEB_H
#include "TemplateMethodBase.h"
/** *******************************************************
@brief :具体实现操作细节B
@author :
@date :2020-03-26
@version :v1.0
@copyright :Copyright (C) 2020 - All Rights Reserved
@warning :
@note
******************************************************** **/
class ConcreteClaseB : public TemplateMethodBase
{
public:
ConcreteClaseB();
public:
virtual void operation1() override;
virtual void operation2() override;
};
#endif // CONCRETECLASEB_H
//.cpp文件
#include "ConcreteClaseB.h"
#include <iostream>
using namespace std;
ConcreteClaseB::ConcreteClaseB()
{
std::cout << "ConcreteClaseB::ConcreteClaseB" << endl;
}
void ConcreteClaseB::operation1()
{
std::cout << "ConcreteClaseB::operation1" << endl;
}
void ConcreteClaseB::operation2()
{
std::cout << "ConcreteClassB::operation2" << endl;
}
//调用代码
#include <iostream>
#include "ConcreteClaseA.h"
#include "ConcreteClaseB.h"
#include "TemplateMethodInterface.h"
using namespace std;
int main()
{
TemplateMethodInterface * interfaceA = new ConcreteClaseA();
interfaceA->templateMethod();
TemplateMethodInterface* interfaceB = new ConcreteClaseB();
interfaceB->templateMethod();
return 0;
}