首页 > 代码库 > 策略模式
策略模式
它定义了一系列的算法,并将每个算法封装起来,而且使他们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。
优点:
1)简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
2)避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3)遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。
缺点:
1)因为每个具体策略类都会产生一个新类,所以会增加系统需要维护类的数量。
2)在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
进一步优化可以将策略模式与简单工厂模式相结合,选择所用具体实现的职责也可以由Context对象承担,这就最大化的减轻了客户端的职责。
结合策略模式与简单工厂模式实现的简单收银系统代码:
Strategy.h:
1 #include<iostream> 2 #include<string> 3 #include<memory> 4 using namespace std; 5 6 //strategy抽象类,用作接口 7 class Strategy 8 { 9 public: 10 virtual double GetResult(double money) = 0; 11 virtual ~Strategy() 12 { 13 cout<<" in the destructor of Strategy"<<endl; 14 } 15 }; 16 //正常结算方式 17 class CashNormal : public Strategy 18 { 19 double GetResult(double money) 20 { 21 return money; 22 } 23 ~CashNormal() 24 { 25 cout<<" in the destructor of CashNormal"<<endl; 26 } 27 }; 28 //打折 29 class CashRebate : public Strategy 30 { 31 private: 32 double moneyRebate; //折扣率 33 public: 34 //构造函数 35 CashRebate(double rebate) 36 { 37 moneyRebate = rebate; 38 } 39 40 double GetRebate() 41 { 42 return moneyRebate; 43 } 44 void SetRebate(double rebate) 45 { 46 moneyRebate = rebate; 47 } 48 49 double GetResult(double money) 50 { 51 return money * moneyRebate; 52 } 53 }; 54 //返现 55 class CashReturn : public Strategy 56 { 57 //返现的条件与方式 58 private: 59 double moneyCondition; 60 double moneyReturn; 61 public: 62 //构造函数 63 CashReturn(double condition, double re) 64 { 65 moneyCondition = condition; 66 moneyReturn = re; 67 } 68 69 double GetCondition() 70 { 71 return moneyCondition; 72 } 73 void SetCondition(double condition) 74 { 75 moneyCondition = condition; 76 } 77 double GetReturn() 78 { 79 return moneyReturn; 80 } 81 void SetReturn(double re) 82 { 83 moneyReturn = re; 84 } 85 86 double GetResult(double money) 87 { 88 if(money >= moneyCondition) 89 { 90 money = money - (int)(money / moneyCondition) * moneyReturn; 91 } 92 return money; 93 } 94 }; 95 96 //现金收费工厂类 97 class CashFactory 98 { 99 public:100 static Strategy* createGetResult(int type)101 {102 Strategy* cs;103 switch(type)104 {105 case 0:106 cs = new CashNormal();107 break;108 case 1:109 cs = new CashRebate(0.8);110 break;111 case 2:112 cs = new CashReturn(300,100);113 break;114 default:115 break;116 }117 return cs;118 }119 };120 121 //CashContext类 策略模式与简单工厂模式相结合122 class CashContext123 {124 private:125 Strategy* cs;126 public:127 CashContext(int type)128 {129 bool loop = true;130 while(loop){131 switch (type)132 {133 case 0:134 cs =new CashNormal();135 loop = false;136 break;137 case 1:138 cs = new CashRebate(0.8);139 loop = false;140 break;141 case 2:142 cs = new CashReturn(300,100);143 loop = false;144 break;145 default:146 cout<<"输入有误! 请重新输入!"<<endl;147 cin>>type;148 break;149 }150 }151 }152 153 double GetResult(double money)154 {155 return cs->GetResult(money);156 }157 };
Strategy.cpp:
1 #include "Strategy.h" 2 void main(int argc, char *argv) 3 { 4 int type = 0; 5 double total = 0; 6 cout<<"选择收费方式:"<<endl 7 <<"0:正常方式"<<endl 8 <<"1:打折方式"<<endl 9 <<"2:返现方式"<<endl;10 cin >> type;11 /*12 CashFactory cfactory;13 Strategy *pay = cfactory.createGetResult(type);14 cout<<"输入总的消费金额:";15 cin >> total;16 cout<<"应收金额为:"<<pay->GetResult(total)<<endl;17 */18 CashContext cs(type);19 cout<<"输入总的消费金额:";20 cin >> total;21 cout<<"应收金额为:"<<cs.GetResult(total)<<endl;22 }
策略模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。