设计模式之-模板方法模式C++实现与C++模板template用法

news2024/11/27 2:15:30

介绍

        模板方法模式使用比较常见,也比较简单,模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。

        模板方法模式使用场景:在设计需求中,将需求固定的步骤抽离出来,对每个固定步骤中不同细节进行差异化实现。固定的这些步骤可以称为模板,模板函数可以设计为虚函数。

需求:

        描述每个动物每天的运动方式,每个动物的运动方式不同。

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)类模板定义如下:

template <class 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 woirld;");
    obj2.pushEle(30.5);
    obj2.printVal();
}

运行结果如下:

附加

设计模式的介绍和分类见下面链接:

C++设计模式介绍与分类_夜雨听萧瑟的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java并发编程:synchronized关键字与锁详解

文章目录 线程安全问题synchroinzed关键字几种锁Java对象头偏向锁轻量级锁自旋锁重量级锁锁升级的场景 JVM 是如何实现 synchronized 的&#xff1f;小结 这篇文章我们来聊一聊Java多线程里面的“锁”。 首先需要明确的一点是&#xff1a;Java多线程的锁都是基于对象的&#x…

御用飞场之惊险炸鸡寻根溯源

御用飞场之惊险炸鸡寻根溯源 1. 源由2. 分析3. 证据4. 总结5. 补充&#xff1a;BetaFlight Mark4 自锁螺母桨叶松动 炸机瞬间 1. 源由 这个炸鸡的原因千奇百怪&#xff0c;不过最终的结果都是相似的。 如果能很好的找到根原因&#xff0c;相对来说&#xff0c;今后炸鸡的概…

element-ui表格el-table的使用

先给大家展示一下效果 Table 属性 属性名说明类型可选值默认值data显示的数据array——heightTable 的高度&#xff0c; 默认为自动高度。 如果 height 为 number 类型&#xff0c;单位 px&#xff1b;如果 height 为 string 类型&#xff0c;则这个高度会设置为 Table 的 sty…

初阶指针(详解)

目录 前言 一 指针是什么 计算机又是如何编址的&#xff1f; 总结 二 指针和指针类型 指针-整数 总结&#xff1a; 指针的解引用 总结 三 野指针 概念 野指针的成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间被释放 如何规避野指针 四 指针运算…

iMazing2.16.9中文最新版iOS设备管理器下载教程

iMazing2.16.9是一款兼容Win和Mac的iOS设备管理软件。iMazing能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。iMazing轻松管理和备份您的 iOS 设备,无需使用 iTunes&#xff0c;iMazing以自己的方式管理 iPhone。让备受信赖的软件为您传…

遗传算法(附简单案例及matlab详细代码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、生物进化二、遗传算法原…

华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

全闪SDS三节点EC(4+2:1)性能挑战测试

前段时间咱们存储圈在讨论一下全闪SDS性能挑战&#xff1a; 三节点集群&#xff0c;用EC&#xff08;42:1&#xff09;&#xff0c;性能目标是&#xff1a;4KB随机读写7:3&#xff0c;达到100万IOPS&#xff0c;平均时延0.5ms&#xff0c;P99时延1ms。硬件配置&#xff1a;网络…

菜鸟的刷题之路之二叉树

&#x1f495;“成功不是终点&#xff0c;失败不是终结&#xff0c;勇气才是启程的第一步。”&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;菜鸟的刷题之路&#x1f386; &#x1f697;本文章主要内容&#xff1a;将…

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程&#xff08;带证书&#xff09; 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录&#xff0c;并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它&#xff0c;运行下面的命令&#xff1a; sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节&#xff08;Byte&#xff09;等于8个二进制位&#xff08;bit&#xff09;。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位&#xff0c;可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…

深入理解Jar文件:创建、使用和多版本控制

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f35b; 一、创建JAR文件 &#x1f35c; 二、安装和使用清单文件 &#x1f35d; 三、创建可执行的JAR文件 &#x1f360; 四、多版…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

近年GDC服务器分享合集(三): 《Sky光·遇》实现百万在线:一种云原生的扩容方法

如今&#xff0c;游戏行业对于云原生技术的使用越来越广泛。特别是那些拥有海量玩家在线的游戏&#xff0c;使用云原生技术可以轻松做到高可用、弹性扩容和降低成本。在GDC 2022上&#xff0c;来自《Sky光遇》项目的工程师分享了相关的经验——《《Sky光遇》实现百万在线&#…

黑马Redis视频教程高级篇(一:分布式缓存)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …