策略模式实战:从硬编码到灵活适配
一、背景与痛点
在面向对象设计中,我们常遇到这样的场景:系统需要支持多种不同的行为,而这些行为在不同子类中表现各异。如果处理不当,代码会变得难以维护。
1.1 初始方案:继承的陷阱
假设我们需要模拟不同种类的熊(如熊大、熊二),它们都有冬眠、爬树等习性。起初,最直观的想法是使用继承。
class Bear {
public:
virtual std::string FavoriteFood() = 0;
void Hibernation() { std::cout << "进行冬眠" << std::endl; }
void ClimbTree() { std::cout << "会爬树" << std::endl; }
void LivingHabit() { std::cout << "住在树洞里面" << std::endl; }
protected:
};
class XiongDa : public Bear {
public:
std::string FavoriteFood() override { return "苹果"; }
};
class XiongEr : public Bear {
public:
std::string FavoriteFood() override { return "蜂蜜"; }
};
这种写法看似简洁,复用性也不错。但当需求变更时,问题就暴露了。比如业务扩展到北极熊或玩具熊:
- 北极熊:不冬眠。


