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

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.kler.cn/a/558741.html

相关文章:

  • openharmony中hdf框架的驱动消息机制的实现原理
  • 01 冲突域和广播域的划分
  • Maven 基础环境搭建与配置(二)
  • Lab13_ Visible error-based SQL injection
  • 新版 WSL2 2.0 设置 Windows 和 WSL 镜像网络教程
  • 掌握 ElasticSearch 精准查询:Term Query 与 Filter 详解
  • ai json处理提示词
  • 粘贴到Word里的图片显示不全
  • ModuleNotFoundError: No module named ‘xgboost‘
  • Docker仿真宇树狗GO1
  • Python--函数进阶(下)
  • MacBooK Pro安装HomeBrew
  • RD-搭建测试环境
  • IDEA使用Maven方式构建SpringBoot项目
  • 2025-skywalking组件
  • 基于Springboot学生宿舍水电信息管理系统【附源码】
  • JavaScript函数-arguments的使用
  • ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?
  • Protobuf proto3 语法讲解(1)
  • x安全服务 y安全体系 z网络安全模型 网络安全体系设计