意图
定义一系列的算法,把它们一个个地封装起来,并让它们可以互相替换。这样使得算法可以随时替换和变更,典型的比如超市的降价策略,同样的商品可能每天有不同的折扣。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class DiscountStrategy { public: virtual void discount() = 0; };
class TenPercent : public DiscountStrategy { public: void discount() override { cout << "10% discount!\n"; } };
class TwentyPercent : public DiscountStrategy { public: void discount() override { cout << "20% discount!\n"; } };
class ThirtyPercent : public DiscountStrategy { public: void discount() override { cout << "30% discount!\n"; } };
class Supermarket { public: Supermarket() = default; void setDiscount(const std::shared_ptr<DiscountStrategy>& strategy) { m_discount = strategy; } void discount() { m_discount->discount(); }
private: std::shared_ptr<DiscountStrategy> m_discount{ nullptr }; };
int main() { Supermarket market; market.setDiscount(std::make_shared<TenPercent>()); market.discount(); market.setDiscount(std::make_shared<TwentyPercent>()); market.discount(); market.setDiscount(std::make_shared<ThirtyPercent>()); market.discount(); return 0; }
|
当超市需要打折的时候,就选择一个打折策略即可,这大大增加了打折的灵活性和扩展性,之后有了新的打折模式,只需要再新增一个打折的策略类即可。
演示代码存在个问题,如果不设置策略,策略指针为空,直接执行打折方法的话会崩溃,可以通过指定一个默认的打折模式来解决。
要点
- 策略模式和状态模式很像,区别在于侧重点不同:状态侧重于当对象的状态改变时需要去做什么,而策略侧重于如何去做,当然在实际应用中完全可以不考虑两者的区别,结合着使用。
- 策略对象往往是享元模式中很好的轻量级对象。