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

相关文章:

  • 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项目
  • 韧性十足的中国外贸企业:“不倒翁”被摁下去,还会再弹起来
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验
  • 今年前4个月上海对拉美国家进出口总值增长2%
  • 国台办:实现祖国完全统一是大势所趋、大义所在、民心所向
  • 人民日报评外卖平台被约谈:合法规范经营,公平有序竞争
  • 中拉论坛部长级会议为何悬挂海地和圣卢西亚的国旗?外交部回应