设计模式学习[9]---模板方法模式

news/2024/11/24 22:15:39/

文章目录

  • 前言
    • 1.原理阐述
    • 2.举例
    • 3.和原型模式的区别
  • 总结

前言

大型的C++项目,都会用到很多模板,C++中关于模板的书也不少,那么在设计模式中的模板模式和C++的模板又有什么区别呢?模板和上篇的原型又有哪些不同?

这篇博客就详细介绍一下。

1.原理阐述

1.1 C++模板说明

在C++中,模板称之为 t e m p l a t e template template。一般把一系列相同定义、相同业务逻辑但类型不同等情况的函数提取出来,作为一个模板,其中共性的部分作为模板。

比如一个比较函数,有int类型的比较函数和float类型的比较函数,如果A比B大则返回1,否则返回-1
下面是一个不严谨的例子,简单看看

template<typename T>
int m_funCompare(const T &A,const T &B)
{if(A>B)return 1;if(A<B)return -1;return 0;
}

这里我们把比较的过程抽离出来,业务逻辑都是一致的,只是比较的参数不同,所以用模板无疑节省了不少工作量。

1.2 设计模式模板

对于模板方法模式,和C++的模板有点类似,但又不完全相同。
书中的定义如下:

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

讲下个人理解:
就是业务流程基本一致,但是在面向对象开发的时候,不同子类的对象对于父类对象的某个操作,有不同的实现方式。其实就是多态的一种体现。

比如我们说鸟会鸣叫,那么麻雀和布谷鸟的鸣叫肯定是不一样的,但是在面向对象开发的时候,我们统一是通过去调用“鸣叫”这个接口(当然如果你硬要用麻雀去调用鸣叫接口,我也没话说),那么我们能否认为这个调用过程其实是固定的,可以认为它就是一种模板。鸟这个父类下面的子类,针对这个接口做不同的实现,但是子类并没有改变这个调用的一个流程。

所以模板方法模式在实现上就是,用父类包装一层相对固定的流程/算法/业务,用子类继承,在子类上面做一些特定的操作。

2.举例

下面将鸟类的例子做一下简单的代码实现

#include<iostream>
using namespace std;
class Bird
{
public:void start(){cout<<"鸟叫开始"<<endl;}virtual void sing()=0;void end(){cout<<"鸟叫结束"<<endl;}void action(){start();sing();end();}
};
class sparrow : public Bird
{void sing(){cout<<""叽叽喳喳"<<endl;}
};
class cuckoo: public Bird
{void sing(){cout<<""布谷布谷"<<endl;}
};
int main()
{Bird* bird1=new sparrow();Bird* bird2=new cuckoo();bird1->action();bird2->action();
}

上面的程序打印内容如下:

鸟叫开始
叽叽喳喳
鸟叫结束
鸟叫开始
布谷布谷
鸟叫结束

这个例子中我把共性的业务流程/算法,放到父类Bird中,不同的子类(鸟),重新实现某个具体的步骤,这里是鸟叫。

3.和原型模式的区别

原型模式
原型模式更倾向于是对象创建,它属于创建型的设计模式。重点是在于对象的创建初始化。
而模板类型,是提取共有的一些过程,它的重点在于过程。模板方法模式它实际上是属于行为型模式。
两者在名字上听起来有点类似,模板,原型,原型不就是类似于一个模板,模板不就是一个原型吗。但是具体的运用场景还是不太一样的,这里要注意。

总结

我们在开发的时候遇到一些共性的业务流程,如果一味的用最简单的逻辑去做,往往是代码量大了,但是重复,冗余。
代码质量很低,同时显得自己的水平也不高。模板方法模式是一种代码复用技术,遇到这种大量重复冗余的情况,多想想设计模式,用多态的思想去处理问题,代码水平更上一层楼。


http://www.ppmy.cn/news/1549646.html

相关文章

低音运行,约克VRF中央空调让居家生活静享安宁

不仅节能省电&#xff0c;约克VRF中央空调还特别注重运行的静音效果&#xff0c;低至17dB超低运行噪音&#xff0c;让你在享受舒适环境的同时&#xff0c;也能拥有宁静的居家氛围。无论是工作、学习还是休息&#xff0c;都不受噪音干扰。

Android Framework WMS面试题及参考答案

目录 什么是 WindowManagerService(WMS)?它的作用是什么? Android 中的 WindowManager 是如何与 WMS 配合工作的? WMS 中的 Window 是如何管理的? WMS 是如何处理窗口的层次关系的? WMS 如何实现窗口的布局? WMS 与 SurfaceFlinger 有什么关系? WMS 中的窗口类…

深入探索JMeter bin目录中的Properties文件:优化性能测试的关键

引言 在现代软件开发中&#xff0c;性能测试是确保应用质量和用户体验的重要环节。Apache JMeter作为一款流行的开源性能测试工具&#xff0c;提供了丰富的功能来模拟各种用户行为和负载情况。本文将深入探讨JMeter中的Properties&#xff08;属性&#xff09;功能&#xff0c…

qt+opengl 三维物体加入摄像机

1 在前几期的文章中&#xff0c;我们已经实现了三维正方体的显示了&#xff0c;那我们来实现让物体的由远及近&#xff0c;和由近及远。这里我们需要了解一个概念摄像机。 1.1 摄像机定义&#xff1a;在世界空间中位置、观察方向、指向右侧向量、指向上方的向量。如下图所示: …

自动驾驶系统研发系列—智能驾驶核心功能:IHC如何提升夜间驾驶体验?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…

【软考】数据库

1. 数据模型 1.1 概念数据模型 概念数据模型一般用 E-R 图表示&#xff0c;常用术语如下&#xff1a; 实体&#xff1a;客观存在的事物&#xff0c;如&#xff1a;一个单位、一个职工、一个部门、一个项目。属性&#xff1a;学生实体有学号、姓名、出生日期等属性。码&#…

Kafka 数据倾斜:原因、影响与解决方案

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

【AI日记】24.11.23 学习谷歌数据分析初级课程-第4课

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容&#xff1a;学习谷歌数据分析初级课程地址&#xff1a;第四课《从脏数据到干净数据的处理》时间&#xff1a;4 小时评估&#xff1a;不错&#xff0c;完成 读书 书名&#xff1a;權力與進步时…