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)