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)