C++模板方法模式

文章目录

      • 1. 定义抽象基类(Abstract Class)
      • 2. 实现具体子类(Concrete Class)
      • 3. 使用模板方法
      • 模板方法模式的优点
      • 模板方法模式的应用场景
      • 注意事项
      • 实现示例
        • 抽象类(模板)
        • 具体实现类
        • 客户端代码
      • 总结

模板方法模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。这种模式非常适合需要控制算法流程,同时允许子类自定义部分行为的场景。

在C++中实现模板方法模式的基本步骤如下:

1. 定义抽象基类(Abstract Class)

首先,定义一个抽象基类,这个基类中包含了一个或多个模板方法和一些抽象方法或具体方法。模板方法定义了算法的整体框架,而抽象方法则是留给子类实现的。

class AbstractClass {
public:
    // 模板方法,定义了算法的骨架
    void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
    }

    // 抽象方法,由子类实现
    virtual void primitiveOperation1() = 0;
    
    // 可能还有其他抽象或具体方法
    virtual void primitiveOperation2() {
        // 默认实现
    }
protected:
    // 可能包含受保护的辅助方法
};

2. 实现具体子类(Concrete Class)

然后,创建抽象基类的子类,并实现其中的抽象方法。子类可以根据需要重写具体方法,但模板方法的结构保持不变。

class ConcreteClassA : public AbstractClass {
public:
    void primitiveOperation1() override {
        // 实现具体操作1
    }
    
    // 如果需要,也可以重写primitiveOperation2
};

class ConcreteClassB : public AbstractClass {
public:
    void primitiveOperation1() override {
        // 实现与ConcreteClassA不同的操作1
    }
};

3. 使用模板方法

客户端代码仅需调用模板方法,而无需知道算法的具体实现细节,提高了代码的抽象层次和复用性。

int main() {
    AbstractClass* a = new ConcreteClassA();
    a->templateMethod();
    delete a;

    AbstractClass* b = new ConcreteClassB();
    b->templateMethod();
    delete b;

    return 0;
}

在这个例子中,templateMethod是模板方法,它定义了执行操作的顺序,而primitiveOperation1primitiveOperation2是抽象方法,由子类实现具体的业务逻辑。这样,我们可以在不修改模板方法的情况下,通过更换不同的子类来改变算法的部分步骤,实现了算法的结构稳定性和步骤可变性的良好平衡。

模板方法模式的优点

  1. 代码复用:模板方法模式在一个类中定义了算法的骨架,而将一些步骤延迟到子类中实现,这使得相同的基本算法可以有不同的具体实现,提高了代码的复用性。

  2. 封装不变部分:将算法中的不变部分(算法的框架)封装在基类的模板方法中,确保了算法整体结构的稳定性和一致性。

  3. 扩展性好:新增新的具体实现时,只需要添加新的子类并实现相应的抽象方法,而不需要修改现有的类库代码,符合开闭原则。

  4. 行为控制:父类可以通过控制模板方法中的逻辑顺序,来控制子类的行为,增强了对系统行为的集中控制。

模板方法模式的应用场景

  • 框架开发:许多软件框架会使用模板方法模式定义其核心流程,而将具体实现留给用户自定义。比如,Junit测试框架中的测试用例运行流程就是一个模板方法模式的例子。

  • UI框架:在图形用户界面(GUI)框架中,绘制组件或处理事件的流程往往是一个固定的模板,而具体的绘制内容或事件响应则由各个组件自己实现。

  • 数据库访问库:数据库操作通常包括打开连接、执行查询、处理结果集、关闭连接等固定步骤,这些步骤可以作为模板方法定义,而具体的SQL语句和结果处理由子类实现。

注意事项

  • 避免过度设计:虽然模板方法模式可以增加代码的灵活性和扩展性,但如果滥用可能导致系统结构过于复杂,增加了理解和维护的难度。

  • 性能考量:由于涉及到虚函数调用,模板方法模式在性能敏感的应用中可能需要权衡。虽然现代编译器的优化已经大大减少了这种开销,但在极端性能要求下仍需注意。

  • 设计决策:确定哪些部分作为模板方法,哪些部分留给子类实现,需要仔细考虑,以达到既灵活又不失控制的目的。

总之,模板方法模式是面向对象设计中一种非常实用的模式,适用于需要定义算法框架并允许子类对部分步骤进行定制化的场景。正确使用它可以显著提升代码的结构和可维护性。

实现示例

为了更好地理解模板方法模式,下面通过一个简单的例子来说明其应用:假设我们正在设计一个冲泡饮料的框架,无论是咖啡还是茶,冲泡过程都包含几个通用步骤(烧水、加入原料、搅拌、倒入杯中),但具体每个步骤的实现细节(如原料种类)根据不同饮料而异。

抽象类(模板)

首先,我们定义一个抽象类Beverage,它充当模板方法模式中的抽象模板角色,定义了冲泡饮料的整个流程框架。

public abstract class Beverage {
    // 模板方法,定义冲泡流程
    public final void brew() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 基本方法,由子类实现
    protected abstract void brew(); // 冲泡(咖啡或茶)
    protected abstract void addCondiments(); // 添加调料(奶、糖等)

    // 具体方法,已实现
    private void boilWater() {
        System.out.println("Boiling water");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 钩子方法,可被子类重写以改变默认行为
    protected boolean customerWantsCondiments() {
        return true;
    }
}
具体实现类

然后,我们创建两个具体实现类,分别代表咖啡(Coffee)和茶(Tea),它们继承自Beverage类,并实现其中的抽象方法。

public class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Brewing Coffee");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding Sugar and Milk to Coffee");
    }
}

public class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the Tea");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding Lemon");
    }
}
客户端代码

最后,客户端代码仅需实例化具体饮料类并调用brew()方法,无需关注冲泡的具体步骤。

public class StarbuzzCoffee {
    public static void main(String[] args) {
        Beverage beverage = new Coffee();
        beverage.brew();

        System.out.println("\n");

        beverage = new Tea();
        beverage.brew();
    }
}

总结

通过这个例子,我们可以看到模板方法模式如何将算法的骨架与具体实现细节分离开来,使得算法的整体结构保持不变的同时,允许子类对某些步骤进行定制,从而提高了代码的复用性和灵活性。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

政府鼓励社会力量建设气膜体育场馆—轻空间

2023年12月1日,国家体育安全总局发布的《关于政协第十四届全国委员会第一次会议第00374号(文体宣传类020号)提案答复的函》中指出,2016年和2020年国务院发布的文件中均涉及推动气膜场馆建设及完善装配式建筑相关政策。下一步&…

Mysql | select语句导入csv后再导入excel表格

需求 从mysql数据库中导出数据到excel 解决方案 sql导出csv文件 sql SELECT col1,col2 FROM tab_01 WHERE col3 xxx INTO OUTFILE /tmp/result.csv FIELDS TERMINATED BY , ENCLOSED BY " LINES TERMINATED BY \n;csv文件导出excel文件 1、【数据】-【导入数据】 …

绕过防火墙过滤规则传输ICMP

ICMP和ICMPv6 ICMP和ICMPv6是Internet的主要协议。这些协议设计用于在数据包未到达目的地时进行连接测试和错误信令。接收ICMP消息让应用程序了解故障原因:数据包太大,没有可用路由等。 ICMP消息 出于不同的目的,ICMP [v6]消息由两个编码为…

仿冒、钓鱼、入侵……警惕邮件安全这些“坑”

为了保证用户对电子邮箱系统的安全使用,保证个人的隐私和财产的安全,我们呼吁每个人都要加强自己的网络安全意识,在对电子邮件进行处理的时候,要对钓鱼邮件进行认真的识别,同时还需要设定一个客户的密码来保证你的邮箱…

苹果手机怎么看海拔高度?快速掌握使用技巧

手机不仅能满足我们日常的通讯需求,还内置了许多实用的功能,其中包括查看海拔高度。无论是登山、徒步、骑行还是只是好奇地想要了解所在地的海拔高度,苹果手机都能够满足您的需求。苹果手机怎么看海拔高度?在本文中,我…

css3 笔记02

目录 01 过渡 02 rotate旋转 03 translate函数 04 真正的3D 05 动画 06 阴影 07 自定义字体库 08 自定义动画库 01 过渡 过渡属性的使用: transition-property:要过渡的css属性名 多个属性用逗号隔开 过渡所有属性就写all transition-duration: 过渡的持续时间 s秒 …

算法课程笔记——素数朴素判定埃氏筛法

算法课程笔记——素数朴素判定&埃氏筛法 sqrt返回浮点数,而且这样可防溢出 优化i*i会更快

XShell免费版的安装配置

官网下载 https://www.xshell.com/zh/free-for-home-school/ 下载地址 通过邮箱验证 新建会话 通过ssh登录树莓派 填写主机IP 点击用户身份验证 成功连接

计算机网络学习

文章目录 第一章信息时代的计算机网络因特网概述电路交换,分组交换,报文交换计算机网络的定义和分类计算机网络的性能指标常见的三种计算机网络体系计算机网络体系结构分层的必要性计算机网络体系结构分层思想举例计算机网络体系结构中的专用术语 第二章…

当传统文化遇上数字化,等级保护测评的必要性

第二十届中国(深圳)国际文化产业博览交易会5月23日在深圳开幕。本届文博会以创办20年为契机,加大创新力度,加快转型升级,着力提升国际化、市场化、专业化和数字化水平,不断强化交易功能,打造富有…

【数学建模】碎纸片的拼接复原

2013高教社杯全国大学生数学建模竞赛B题 问题一模型一模型二条件设立思路 问题求解 问题一 已知 d i d_i di​为第 i i i张图片图片的像素矩阵 已知 d i d_i di​都是 n ∗ m n*m n∗m二维矩阵 假设有 N N N张图片 模型一 我们认为对应位置像素匹配为 d i [ j ] [ 1 ] d k…

PaliGemma – 谷歌的最新开源视觉语言模型(一)

引言 PaliGemma 是谷歌推出的一款全新视觉语言模型。该模型能够处理图像和文本输入并生成文本输出。谷歌团队发布了三种类型的模型:预训练(PT)模型、混合(Mix)模型和微调(FT)模型,每…

项目计划书(Word)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全资料获取:点我获取 本文末个人名片获…

mac下载安装好软件后提示已损坏

mac下载安装好软件后提示已损坏 解决方法: 首先确保系统安全设置已经改为任何来源。 打开任何来源后,到应用程序目录中尝试运行软件,如果仍提示损坏,请在应用图标上,鼠标右键,在弹出菜单中点打开。 如果…

基于 IP 的 DDOS 攻击实验

介绍 基于IP的分布式拒绝服务(Distributed Denial of Service, DDoS)攻击是一种利用大量受控设备(通常是僵尸网络)向目标系统发送大量请求或数据包,以耗尽目标系统的资源,导致其无法正常提供服务的攻击方式…

巨额分红与大幅下调募资金额,小方制药注册生效半年后仍无进展

《港湾商业观察》施子夫 2022年7月1日,上海小方制药股份有限公司(以下简称,小方制药)递表上交所板,2023年9月1日公司提交了注册申请,并于同年12月19日获得生效。 离挂牌上市仅有一步之遥的小方制药注册生…

金融行业专题|超融合对国密卡和国产加密技术的支持能力如何?

目前,不少金融机构都使用国密卡(满足国密算法要求的加密卡)和国产密码解决方案保障金融信息安全。而在传统虚拟化架构下,单块加密卡通常只能服务一个系统,经常会出现资源利用率低、加密处理性能不足等问题,…

【设计模式】JAVA Design Patterns——Data Transfer Object(数据传递对象模式)

🔍目的 次将具有多个属性的数据从客户端传递到服务器,以避免多次调用远程服务器 🔍解释 真实世界例子 我们需要从远程数据库中获取有关客户的信息。 我们不使用一次查询一个属性,而是使用DTO一次传送所有相关属性。 通俗描述 使用…

剪画小程序:自媒体创作的第一步:如何将视频中的文案提取出来?

自媒体创作第一步,文案提取无疑是至关重要的一环。 做自媒体之所以要进行文案提取,有以下重要原因: 首先,提高效率。通过文案提取,可以快速获取关键信息,避免在无关紧要的内容上浪费时间,从而…

饮料添加剂新型褪色光照试验仪器太阳光模拟器

太阳光模拟器的定义和功能 太阳光模拟器是一种高科技设备,它可以模拟太阳光的光谱、光强和光照条件,用于实验室环境中对太阳能电池、光电器件以及其他需要太阳光条件的设备和材料进行评估。太阳光模拟器的主要功能包括模拟太阳光的光谱分布、辐照度、光…