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)