策略模式定义了算法族,分别封装起来, 让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,在运行时方便的根据需要在各个算法之间进行切换。
二 结构模式:

三 例如以下场景:
计算税收时,每个国家的税收算法是不一样的,比如现在有要计算三个国家的税收,一般情况,不用设计模式时的代码:
enum TaxBase { CN_Tax, US_Tax, DE_Tax }; class SalesOrder { public: TaxBase tax; public: double CalculateTax() { if (tax = CN_Tax) { //中国税收的算法 } else if (tax = US_Tax) { //美国税收的算法 } else if (tax = DE_Tax) { //德国税收的算法 } } };
以上代码有个缺点,如果再要计算日本、韩国...等多个国家时,就得修改CalculateTax()函数里面添加的代码,并且给枚举里面添加。代码设计原则是尽量不要改动之前写过的代码,最好是扩展。例如以下代码用到策略模式:
class TaxStrategy { virtual double Calculate(const Context &context) = 0; virtual ~TaxStrategy(){} }; class CNTax :public TaxStrategy { virtual double Calculate(const Context &context) { //中国税收算法 } }; class USTax :public TaxStrategy { virtual double Calculate(const Context &context) { //美国税收算法 } }; class DETax :public TaxStrategy { virtual double Calculate(const Context &context) { //德国税收算法 } }; class SalesOrder { public: SalesOrder(StrategyFactory *strategyFactory) { this->strategy = strategyFactory->NewStratety; //根据不同需求,用工厂模式产生不同的对象 } ~SalesOrder() { delete this->strategy; } public: double CalculateTax() { strategy->Calculate(context); //在运行时方便的根据需要在各个算法之间进行切换 } private: TaxStrategy *strategy; };
原文:https://www.cnblogs.com/zwj-199306231519/p/13715639.html