当前位置: 首页 > 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 类图精髓

http://www.dtcms.com/a/31201.html

相关文章:

  • python中的异常-模块-包
  • 基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)
  • Vue 和 React 响应式的区别
  • 波兰发布世界首个双足肌肉骨骼机器人,细节高度模拟人类生物特征
  • 远离手机APP——数字排毒,回归生活本真
  • 边缘安全加速(ESA)套餐
  • 图解MySQL【日志】——Binlog
  • Web Scraper,强大的浏览器爬虫插件!
  • 前端开发的适配方案
  • grafana 忘记登陆密码
  • 【学习】验证数独的正确性
  • 从零开始玩转TensorFlow:小明的机器学习故事 2
  • [C++ ]使用std::string作为函数参数时的注意事项
  • 【Java 优选算法】位运算
  • Vmware虚拟机Ubantu安装Docker、k8s、kuboard
  • 银行IT治理——安全架构定义
  • 企业组网IP规划与先关协议分析
  • overflow-x: auto 使用鼠标实现横向滚动,区分触摸板和鼠标滚动事件的方法
  • 【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
  • STM32-温湿度上传OneNET项目
  • 机器学习 - 衡量模型的特性
  • 合合信息2025届春季校园招聘全面启动!
  • 深入浅出机器学习:概念、算法与实践
  • 一篇搞懂vue3中如何使用ref、reactive实现响应式数据
  • Vue3+element UI:使用el-dialog时,对话框不出现解决方案
  • Mysql 迁移 dm 数据库
  • ip属地是电话号码吗怎么改
  • 企业知识管理平台重构数字时代知识体系与智能服务网络
  • 利用爬虫精准获取淘宝商品描述:实战案例指南
  • 腾讯云cloudstudio使用笔记(一)