介绍
模板方法模式使用比较常见,也比较简单,模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。
模板方法模式使用场景:在设计需求中,将需求固定的步骤抽离出来,对每个固定步骤中不同细节进行差异化实现。固定的这些步骤可以称为模板,模板函数可以设计为虚函数。
需求:
描述每个动物每天的运动方式,每个动物的运动方式不同。
1、使用模板方式代码实现如下:
#include <iostream>
#include <string>
class Animal
{
public:
Animal(std::string name):m_name(name){};
virtual ~Animal(){};
virtual void Sports(){};
void dailyActivities(){
std::cout << "To do something." << std::endl;
Sports();
};
protected:
std::string m_name;
};
class Bird:public Animal
{
public:
Bird(std::string name):Animal(name){};
virtual ~Bird(){};
void Sports()override{std::cout << m_name << " the mode of movement is flying." << std::endl;};
};
class Cat:public Animal
{
public:
Cat(std::string name):Animal(name){};
virtual ~Cat(){};
void Sports()override{std::cout << m_name << " The mode of movement is running." << std::endl;};
};
int main()
{
Animal* ani1 = new Bird("bird");
ani1->dailyActivities();
std::cout << "\n" << std::endl;
Animal* ani2 = new Cat("cat");
ani2->dailyActivities();
delete ani1;
ani1 = nullptr;
delete ani2;
ani2 = nullptr;
return 0;
}
运行结果如下:
2、C++模板用法
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
常用的模板用法有容器(vector,map,,,,,)
(1)函数模板定义如下:
template <typename type> ret-type func-name(parameter list)
{
// 函数的主体
}
(2)类模板定义如下:
//类模板写法1
template <class type> class class-name {
.
.
.
}
//类模板写法2
template <typename type> class class-name {
.
.
.
}
在模板定义语法中关键字typename和class的用途一样,class用于模板中在有些场景下会导致编译器不能区分是类型和成员的问题,所以引入的新的关键字typename,推荐使用typename。关于typename的由来和用法见:
C++typename的由来和用法 - 知乎 (zhihu.com)
函数模板和类模板的demo:
#include <iostream>
#include <string>
#include <vector>
template <typename T1>
const T1& CheckMax(const T1 &t1,const T1 &t2)
{
return t1 > t2 ? t1 : t2;
}
template <typename T3>
class Myclass1{
public:
void pushEle(T3 val){m_vec3.emplace_back(val);};
void printVal(){if(m_vec3.size() > 0){std::cout << "vec3 " << m_vec3.at(0) << std::endl;}};
private:
std::vector<T3>m_vec3;
};
template <typename T4,typename T5>
class Myclass2{
public:
void assignVal(T4 val){m_val1 = std::move(val);};
void pushEle(T5 val){m_vec5.emplace_back(std::move(val));};
void printVal(){
std::cout << "m_val1 " << m_val1 << std::endl;
if(m_vec5.size() > 0)
{std::cout << "m_vec5 " << m_vec5.at(0) << std::endl;
}
};
private:
T4 m_val1;
std::vector<T5> m_vec5;
};
int main()
{
std::cout << "CheckMax(3,80) " << CheckMax(3,80) << std::endl;
Myclass1<int>obj1;
obj1.pushEle(10);
obj1.printVal();
std::cout << "\n" << std::endl;
Myclass2<std::string,float>obj2;
obj2.assignVal("hello world;");
obj2.pushEle(30.5);
obj2.printVal();
}
运行结果如下:
附加:
设计模式的介绍和分类见下面链接: