一、策略模式简介
策略模式是把算法和内容相分离,针对不同的策略实现不同的函数,用于处理内容中的数据,减少了算法类和使用算法类之间的耦合,并且由于算法的实现被单独的抽离出来,所以对不同算法的实现进行单元测试时也会更加的方便。
策略模式也可以与简单工厂模式相结合,在服务端内部是利用策略模式进行解耦合,在服务器与客户端之间是利用简单工厂模式进行解耦合。
策略模式就是用来封装算法的,在实践中,我们发现可以用它封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务,则就可以考虑使用策略模式来处理这种变化的可能。
策略模式中,具体选择执行哪条实现,需要客户端指定,并转交给策略模式的context对象。
二、UML类图
三、C++代码实现
// 策略基类 #ifndef _CASHSUPER_HPP #define _CASHSUPER_HPP class CashSuper{ public: virtual double acceptCash(double money) = 0; }; #endif
// 策略1,不优惠 #ifndef _CASHNORMAL_HPP #define _CASHNORMAL_HPP #include"cashsuper.hpp" class CashNormal:public CashSuper{ public: virtual double acceptCash(double monkey) override { return monkey; } }; #endif
// 策略2 打八折 #ifndef _CASHREBATE_HPP #define _CASHREBATE_HPP #include"cashsuper.hpp" class CashRebate:public CashSuper{ public: virtual double acceptCash(double monkey) override { return monkey * discount / 10; } private: double discount = 8; }; #endif
// 策略3.满200减100 #ifndef _CASHRETURN_HPP #define _CASHRETURN_HPP #include"cashsuper.hpp" class CashReturn:public CashSuper{ public: virtual double acceptCash(double monkey) override { if( monkey > monkeyCondition){ return monkey - monkeyReduction; } else{ return monkey; } } private: double monkeyCondition = 200; double monkeyReduction = 100; }; #endif
// 上下文类 包含策略方法及简单工厂模式 #ifndef _CASHCONTEXT_HPP #define _CASHCONTEXT_HPP #include<string> #include"cashsuper.hpp" #include"cashreturn.hpp" #include"cashnormal.hpp" #include"cashrebate.hpp" using namespace std; class CashContext{ public: CashContext(string type){ if(type == "无优惠"){ cs = new CashNormal(); } else if(type == "打八折"){ cs = new CashRebate(); } else if(type == "满200减100") { cs = new CashReturn(); } else{ cs = nullptr; } } ~CashContext(){ if(cs){ delete cs; cs = nullptr; } } double getResult(double monkey){ if(!cs){ return monkey; } return cs->acceptCash(monkey); } private: CashSuper* cs; string type; }; #endif
// 客户端测试代码 #include<iostream> #include<string> #include"cashcontext.hpp" #include"cashsuper.hpp" using namespace std; int main(){ double monkey = 300; double result; string option[3]{"无优惠", "打八折", "满200减100"}; CashContext cs(option[0]); result = cs.getResult(monkey); cout << result<<endl; CashContext cs1(option[1]); result = cs1.getResult(monkey); cout << result<<endl; CashContext cs2(option[2]); result = cs2.getResult(monkey); cout << result<<endl; getchar(); return 0; }