当前位置: 首页 > news >正文

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 类图精髓

相关文章:

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)) {st…...

靶场之路-Kioptix Level-1 mod_ssl 缓冲区溢出漏洞

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、准备工作 首先使用 vmware 导入靶机文件&#xff0c; 然后网络模式改成 nat 模式即可 我们打…...

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…...

stm32mp采用spi接口扩展can

在 STM32MP 系列微处理器中,通过 SPI 转 CAN 功能扩展 CAN 接口需要结合硬件设计(如使用 SPI 接口的 CAN 控制器芯片)和 Linux 驱动配置。以下是详细的实现步骤和关键点: 硬件选型与连接 常用 SPI 转 CAN 芯片MCP2515:经典 SPI 转 CAN 控制器,支持 CAN 2.0B。MCP2517FD:…...

forge-1.21.x模组开发(二)给物品添加功能

功能效果 创建一个兑换券&#xff0c;当使用兑换券对着兑换机右键时&#xff0c;获得一条烤鱼 创建兑换券 创建ExchangeCouponsItem.java&#xff0c;继承Item&#xff0c;定义兑换券内容 public class ExchangeCouponsItem extends Item {public ExchangeCouponsItem(Prop…...

创建第一个 Maven 项目(一)

一、引言 在 Java 开发的广袤天地中&#xff0c;Maven 宛如一位全能的管家&#xff0c;发挥着举足轻重的作用。它是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和构建自动化工具&#xff0c;极大地简化了 Java 项目的开发流程。 Maven 的核心优势之一在于其强…...

网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战

园区网典型组网架构及案例实战 园区网&#xff1a;内部运行了园区网协议的一个主体网络 园区网络典型架构 园区网络常用协议与技术&#xff1a; 接入层&#xff1a; VLAN、生成树、链路聚合、AAA、dhcp-snooping等 汇聚层&#xff1a;DHCP、堆叠、链路聚合、生成树、OSPF、静…...

python-leetcode-二叉树的直径

543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solutio…...

ubuntu中打包与压缩命令详解

Ubuntu 中打包与压缩命令详解 在 Ubuntu 系统中&#xff0c;打包和压缩文件是常见的操作。通过打包和压缩&#xff0c;可以将多个文件或目录合并为一个文件&#xff0c;并减小文件大小以节省存储空间或方便传输。本文将详细介绍 Ubuntu 中常用的打包与压缩命令及其用法。 目录…...

Linux MySQL 8.0.29 忽略表名大小写配置

Linux MySQL 8.0.29 忽略表名大小写配置 问题背景解决方案遇到的问题&#xff1a; 问题背景 突然发现有个大写的表报不存在。 在Windows上&#xff0c;MySQL是默认支持忽略大小写的。 这个时候你要查询一下是不是没有配置&#xff1a; SHOW VARIABLES LIKE lower_case_table…...

【c++】【线程池】线程池模式

【c】【线程池】线程池模式 1 L/F领导者与跟随者模式 概述&#xff1a;在此模式中&#xff0c;线程池中的线程分为&#xff1a;领导者&#xff08;Leader&#xff09;&#xff0c;跟随者&#xff08;Follower&#xff09;和工作者&#xff08;Processor&#xff09; 领导者线…...

Next.js 学习-1

Next.js学习 引用&#xff1a;https://www.nextjs.cn/learn/basics/create-nextjs-app 先试试水吧&#xff0c;正好dify用的这个构建的前端项目。 使用 如果您尚未安装 Node.js&#xff0c;请 从此处安装。要求 Node.js 10.13 或更高版本。 好吧得用新的了&#xff0c;记得…...

bat命令在b站下载单个音视频

文章目录 单个音频第一行代码第二行代码下载后效果图 单个视频第一行代码第二行代码第三行代码第四行代码第五行代码下载后效果图 单个音视频第一行代码第二行代码第三行代码第四行代码第五行代码第六行代码下载后的效果图 单个音频 chcp 65001 you-get -o D:\Files\pydownloa…...

函数中的形参和实参(吐槽)

def greet_user(user_name):print(f"Hello,{user_name.title()}!")greet_user("zhangsan") 在以上函数中&#xff0c;user_name是形参&#xff0c; 在greet_user("zhangsan")中&#xff0c;值“zhangsan”是实参。这本身没什么大问题。 但是这…...

运维Ansible面试题及参考答案

目录 简述 Ansible 的工作原理,它是如何实现对远程主机管理的? Ansible 是基于什么语言开发的?这门语言的特性对 Ansible 的功能实现有哪些帮助? 解释 Agentless 在 Ansible 中的含义,与基于 Agent 的自动化工具相比,优势体现在哪? Ansible 中的 Inventory 文件是什…...

3、优先级翻转问题

FreeRTOS优先级翻转是当高优先级任务因等待低优先级任务占用的资源&#xff08;如互斥锁&#xff09;被阻塞&#xff0c;而中优先级任务趁机执行&#xff0c;导致高优先级任务无法及时运行的调度异常。 场景示例&#xff1a; 任务优先级&#xff1a;存在三个任务&#xff0c;优…...

python 进程池的基本使用

Python 进程池&#xff1a;Pool任务调度实现 在现代计算机系统重&#xff0c;处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池&#xff08;Pool&#xff09;机制&#xff0c;为开发者提供了 一个高效且易用的并行处理框架。 通…...

从零开始学 Rust:基本概念——变量、数据类型、函数、控制流

文章目录 Variables and MutabilityShadowing Data TypesScalar TypesCompound Types FunctionsFunction Parameters CommentsControl FlowRepetition with Loops Variables and Mutability fn main() {let mut x 5;println!("The value of x is: {}", x);x 6;pri…...

记录一次SpringMVC的406错误

原生态的406错误 1. 错误起因2. 解决办法解决方式一 检查是否有导入jackson依赖解决方式二 检查web.xml中是否有配置.html 3. 再次测试 1. 错误起因 最近博主准备重新撸一遍SSM以及SpringBoot的源码&#xff0c;于是用原始的SpringMVC写了一个demo&#xff0c;并且用Tomcat进行…...

Github 2025-02-23 php开源项目日报 Top9

根据Github Trendings的统计,今日(2025-02-23统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9JavaScript项目2Shell项目1TypeScript项目1Blade项目1Java项目1ASP项目1Vue项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:…...

AI 应用软件的开发技术

开发现代 AI 应用软件的技术栈早已超越了简单的“前端后端”模式。在 2026 年&#xff0c;一个完整的 AI 原生&#xff08;AI-Native&#xff09;应用通常由以下四大技术层级驱动。1. 模型与算力层这是应用的底层核心&#xff0c;负责推理与生成。大模型引擎&#xff1a; 开发者…...

避开中介效应陷阱:经济学论文机制检验的另类思路与实操解析

经济学机制检验的突围之路&#xff1a;当中介效应模型不再适用时如何破局 经济学研究中对因果关系的执着追求&#xff0c;使得机制检验成为论文中最令人辗转反侧的部分。当审稿人要求"请补充机制分析"时&#xff0c;许多研究者会条件反射般地打开中介效应模型的Stata…...

M1 MacBook Air 256G硬盘福音:保姆级教程安装ARM原生版MacTeX-no-gui(附清华源配置)

M1 MacBook Air 256G硬盘福音&#xff1a;保姆级教程安装ARM原生版MacTeX-no-gui&#xff08;附清华源配置&#xff09; 对于M1芯片的MacBook Air用户来说&#xff0c;256GB的存储空间常常捉襟见肘。TeX作为科研工作者和学术写作者的必备工具&#xff0c;传统安装方式往往占用大…...

推荐一些可以用于论文降重的软件:哪些可以同时降低查重与AIGC率?2026年爆款TOP5深度评测!

CSDN学术极客专栏 / 2026届毕业生抢救指南&#xff1a; 各位C站的科研同行、学弟学妹们&#xff0c;晚上好。临近毕业季&#xff0c;我的主页几乎被同一个问题刷爆&#xff1a;“博主&#xff0c;推荐一些可以用于论文降重的软件吧&#xff01;我用常规工具降完了重&#xff0c…...

ComfyUI+Stable Audio Open:游戏开发者如何5分钟生成逼真环境音效(附实战案例)

ComfyUIStable Audio Open&#xff1a;游戏开发者如何5分钟生成逼真环境音效&#xff08;附实战案例&#xff09; 当你在深夜调试游戏场景时&#xff0c;突然发现缺少关键的环境音效——雨林中的虫鸣、古堡走廊的木质地板吱呀声、未来都市的悬浮车引擎嗡鸣。传统音效制作流程可…...

告别串口模式:在Ubuntu 22.04上为FTDI芯片启用D2XX驱动(含VCP卸载与MPSSE功能开启)

解锁FTDI芯片的隐藏潜能&#xff1a;Ubuntu 22.04下D2XX驱动配置全指南 当你在Linux系统中插入一块FTDI芯片开发板时&#xff0c;系统通常会将其识别为普通的串口设备&#xff08;/dev/ttyUSBx&#xff09;。这种默认行为虽然方便了基础通信&#xff0c;却完全掩盖了FTDI芯片最…...

高端地铁/轻轨门控系统控制器功率器件选型方案——高可靠、长寿命与安全驱动系统设计指南

随着城市轨道交通向智能化、高密度运营方向发展&#xff0c;高端地铁与轻轨的门控系统作为保障乘客安全与运营效率的关键执行单元&#xff0c;其驱动控制器的可靠性、响应速度及环境适应性要求极为严苛。功率开关器件作为驱动器的核心&#xff0c;直接决定了系统的开关损耗、热…...

3分钟上手Topit:让Mac窗口置顶成为你的生产力倍增器

3分钟上手Topit&#xff1a;让Mac窗口置顶成为你的生产力倍增器 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否曾在Mac上工作时&#xff0c;需要同时参考…...

用CubeIDE搞定LCD12864:手把手教你移植字库并显示自定义汉字

STM32CubeIDE实战&#xff1a;LCD12864自定义字库开发全指南 在嵌入式设备的人机交互界面开发中&#xff0c;LCD12864液晶屏因其高性价比和良好的显示效果被广泛应用。但当我们需要显示特殊符号、罕见汉字或自定义图形时&#xff0c;内置字库往往无法满足需求。本文将带你从零开…...

I2C总线长距离传输解决方案与信号完整性优化

1. I2C总线长距离传输的挑战与解决方案在嵌入式系统和设备间通信中&#xff0c;I2C总线因其简单的两线制设计&#xff08;SCL时钟线和SDA数据线&#xff09;而广受欢迎。然而标准I2C协议最初设计用于板级短距离通信&#xff0c;当需要扩展到20米甚至更长距离时&#xff0c;会遇…...