策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
1、需要使用ConcreteStrategy提供的算法 2、内部维护一个Strategy的实例 3、负责动态设置运行时Strategy具体的实现算法 4、负责跟Startegy之间的交互和数据传递
1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现
1、实现了Strategy定义的接口,提供具体的算法实现
#include <iostream>#include <cmath>#include <string>using namespace std;class CashSuper{public: virtual double acceptMoney(double money)=0;};class CashNormal : public CashSuper{public: double acceptMoney(double money) { return money; }};class CashRebate : public CashSuper{PRivate: double discount;public: CashRebate(double dis) { discount =dis; } double acceptMoney(double money) { return money*discount; }};class CashReturn : public CashSuper{private: double moneyCondition; double moneyReturn;public: CashReturn(double mc,double mr) { moneyCondition=mc; moneyReturn=mr; } double acceptMoney(double money) { double result=money; if(money>=moneyCondition) { result=money-floor(money/moneyCondition)*moneyReturn; } return result; }};class CashContext{private: CashSuper *cs;public: CashContext(string str) { if(str=="正常消费") { cs=new CashNormal(); } else if (str=="打9折") { cs=new CashRebate(0.9); } else if(str=="满1000送200") { cs=new CashReturn(1000,200); } } double getResult(double money) { return cs->acceptMoney(money); }};int main(){ double money=1000; CashContext *cc=new CashContext("正常收费"); cout<<cc->getResult(money); return 0;}新闻热点
疑难解答