C++ 设计模式-访问者模式


C++访问者模式

一、模式痛点:当if-else成为维护噩梦

开发动物园管理系统,最初的需求很简单:

class Animal {
   };
class Cat : public Animal {
   };
class Dog : public Animal {
   };

// 处理动物叫声
void makeSound(Animal* a) {
   
    if (auto c = dynamic_cast<Cat*>(a)) {
   
        std::cout << "Meow!\n";
    } else if (auto d = dynamic_cast<Dog*>(a)) {
   
        std::cout << "Woof!\n";
    }
}

当新增喂养功能时,代码迅速腐化:

void feedAnimal(Animal* a) {
   
    if (auto c = dynamic_cast<Cat*>(a)) {
   
        std::cout << "Give fish\n";
    } else if (auto d = dynamic_cast<Dog*>(a)) {
   
        std::cout << "Give bone\n";
    }
}

系统痛点

  • 每新增功能就要修改所有类型判断逻辑
  • 类型检查与业务逻辑高度耦合
  • 违反开放封闭原则(OCP)

二、模式实现:双分派的艺术

2.1 类图精髓

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

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

相关文章

tauri2实现监听记住窗口大小变化,重启回复之前的窗口大小

要想实现记住窗口大小的功能&#xff0c;整体逻辑就是要监听窗口大小变化&#xff0c;将窗口大小保存下来&#xff0c;重启之后&#xff0c;读取保存的大小&#xff0c;然后恢复。这里可以使用rust层实现&#xff0c;也可以在前端实现。我这里就纯rust层实现了。 监听窗口变化…

【好玩的工具和命令】 ASCII 艺术生成工具: figlet

figlet 是一款用于生成 ASCII 艺术文字的工具&#xff0c;支持多种字体样式。它能将输入的文本转换为由字符组成的大型字母图案&#xff0c;广泛应用于命令行环境下的标题展示或装饰。 核心功能 生成 ASCII 文字艺术&#xff1a;将普通文本转化为大号的、由字符构成的艺术字…

Golang 相关的github 开源项目

1. pan-light url: http://github.com/peterq/pan-lightstar: 12.1kfork: 2.5kwatch: 284 用Golang和Qt5编写的不限速版百度网盘。相比之前版本的百度网盘客户端&#xff0c;当前版本拥有更友好、便捷的图形界面&#xff0c;体量更轻&#xff0c;便于使用&#xff0c;只需下载…

[ComfyUI]Recraft贴图开源方案,实现服装印花自由

一、介绍 今天发现了一个简单又好用的插件&#xff0c;可以实现类似Recraft的贴图功能&#xff0c;这是一个作者开发的ComfyUI插件&#xff0c;叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数&#xff0c;形状、透明度、倾斜、拉升和混合模式等诸多可控…

C语言--正序、逆序输出为奇数的位。

题目&#xff1a; 采用正序和逆序分别输出为奇数的位。例如输入12345&#xff0c;正序输出135&#xff0c;逆序输出531 代码&#xff1a; #include <stdio.h>void printOddDigits(int num) {int res 0;int divider 10;while (num / divider > 10) {divider * 10;…

最新版IDEA下载安装教程

一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…

Windows10系统本地部署Ollama_DeepSeek-R1实操手册

前言&#xff1a; 在当今人工智能飞速发展的时代&#xff0c;大语言模型的应用与探索不断拓展着科技边界。Ollama 作为一款开源且极具创新性的工具&#xff0c;为本地部署大语言模型开辟了便捷通道。它操作简便&#xff0c;极大降低了模型部署门槛&#xff0c;让开发者无需复杂…

netty基础知识梳理和总结

目录标题 由来netty整体结构核心功能可扩展的事件模型统一的通信 API零拷贝机制与字节缓冲区 传输服务协议支持 netty的IO模型netty核心组件ChannelEventLoop、EventLoopGroupChannelHandlerChannelPipelineBootstrapFuture netty的bytebufbytebuf的内部构造bytebuf的使用模式B…

Flutter_学习记录_各个屏幕的适配

用flutter的这个库&#xff0c;可以解决&#xff1a;https://pub.dev/packages/flutter_screenutil 使用方法&#xff1a; 在pubspec.yaml文件中&#xff0c;添加库&#xff0c;如下图&#xff1a; 在main.dart中导入头文件 import package:flutter_screenutil/flutter_scre…

关闭超时订单和七天自动确认收货+RabbitMQ规范

关闭超时订单 创建订单之后的一段时间内未完成支付而关闭订单的操作&#xff0c;该功能一般要求每笔订单的超时时间是一致的 TTL&#xff08;Time To Live&#xff09;存活时间&#xff0c;只能被设置为某个固定的值&#xff0c;不能更改&#xff0c;否则抛出异常 死信&#…

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…

13th Labour of Heracles CodeForces - 1466D

题目&#xff1a;题目链接 题目大意 题目描述 给定一棵树&#xff0c;它的每个点都有对应的权值。 定义颜色x的同色子图为图中所有颜色为x的边&#xff0c;及其顶点形成的同色子图。 一个同色连通块的权值为该连通块所包含的点的权值的和。 一个同色子图的权值定义为子图内…

在多项目并行时,若遇到项目冲突的情况应该如何处理

在项目管理中&#xff0c;尤其是在多项目并行的情况下&#xff0c;项目冲突是一个不可避免的问题。当多个项目同时进行时&#xff0c;由于资源有限、时间紧张或优先级不清晰&#xff0c;常常会发生资源冲突、进度冲突、需求冲突等问题。解决项目冲突的关键在于有效的沟通、优先…

Linux 驱动入门(5)—— DHT11(温湿度传感器)驱动

文章目录 一、编译替换内核和设备树二、DHT11 温湿度传感器1. DHT11 简介2. 数据格式3. 编程思路 三、驱动代码1. GPIO 实现1.1 驱动层代码1.2 应用层代码 2. 设备树实现2.1 修改设备树2.2 驱动层代码2.3 应用层代码 3. 上机测试 一、编译替换内核和设备树 在编译驱动程序之前…

Docker仿真宇树狗GO1

1. 启动容器 docker run -it --rm humble_suo bash2. 安装Go1 的仿真包 apt update apt install -y git cmake build-essential git clone https://github.com/unitreerobotics/unitree_ros.git cd unitree_ros colcon build source install/setup.bash3. 启动仿真环境 ros2…

网页制作06-html,css,javascript初认识のhtml如何建立超链接

超链接有外部链接、电子邮件链接、锚点链接、空链接、脚本链接 一、内部链接 与自身网站页面有关的链接被称为内部链接 1、创建内部链接 1&#xff09;语法&#xff1a; <a href"链接地址"> …… </a> 2&#xff09;举例应用&#xff1a; 3&#xf…

brew Nushell mac升级版本

运行命令&#xff1a; brew upgrade nushell 国内更新比较慢建议架个梯子。 如果没有更新则先更新一下brew brew update 更新后看下版本是否死最新的了

使用IDEA提交SpringBoot项目到Gitee上

登录Gitee并新建仓库 创建本地仓库 提交本地代码到本地仓库 提交本地代码到远程仓库

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么&#xff1f; 2、selenium的工作原理 3、如何使用selenium&#xff1f; webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么&#xff1f; 用于Web应用程序测试的工具。可以驱动浏览…

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者&#xff1a;飞天大河豚 引言 2025年的前端开发领域&#xff0c;Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化&#xff0c;两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…