策略模式---商场促销(C++实现)
2014-01-11 15:36
656 查看
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它(策略模式)可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类的之间的耦合。
策略模式就是用来封装算法的,但在实践中,可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
[align=left] [/align]
以商场促销活动为例,可以有多种促销方式,如打折、返现、积分等。这些活动都对应着不同的算法,也就是不同的策略来计算应付的金额。如果不对这些策略进行封装,每次活动的改变都要修改程序中的很多地方,不够灵活,可维护性差。将所有的策略封装成相互独立的类,由一个统一的抽象类Strategy类指明具体用到的策略类。还需要一个上下文策略类来配置这些策略即Context类。
如果有新的促销活动需要加入,只需再写一个对应的策略类,并在CashContext类中修改部分代码即可实现。
策略模式就是用来封装算法的,但在实践中,可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
[align=left] [/align]
以商场促销活动为例,可以有多种促销方式,如打折、返现、积分等。这些活动都对应着不同的算法,也就是不同的策略来计算应付的金额。如果不对这些策略进行封装,每次活动的改变都要修改程序中的很多地方,不够灵活,可维护性差。将所有的策略封装成相互独立的类,由一个统一的抽象类Strategy类指明具体用到的策略类。还需要一个上下文策略类来配置这些策略即Context类。
#include <iostream> using namespace std; /*付款金额计算的抽象类*/ class CashSuper { public: /*计算应付金额*/ virtual double AcceptCash(double money) = 0; }; /*正常收费策略*/ class CashNormal : public CashSuper { public: virtual double AcceptCash(double money) { return money; } }; /*打折收费策略*/ class CashRebate : public CashSuper { private: double discount; public: CashRebate( double dis ) : discount(dis) { } virtual double AcceptCash(double money) { return money * discount; } }; /*返现收费策略*/ class CashReturn : public CashSuper { private: double moneyCondition; double moneyReturn; public: CashReturn( double condition, double retu ) : moneyCondition(condition), moneyReturn(retu) {} virtual double AcceptCash(double money) { double result = money; if( money > moneyCondition ) { result = money - ( static_cast<int>( money / moneyCondition ) ) * moneyReturn; } return result; } }; /* 收费策略 */ class CashContext { private: CashSuper* cs; /* 声明付款金额的收费策略 */ public: /*初始化时,传入具体的策略对象(正常、打折、返现)*/ CashContext(int type) { switch(type) { case 1: cs = new CashNormal(); break; case 2: cs = new CashRebate(0.8); break; case 3: cs = new CashReturn(300, 100); break; default: throw exception("没有这种促销活动"); } } ~CashContext() { delete cs; } /*得到现金计算结果(利用了多态机制,不同的策略行为导致不同的结果)*/ double GetResult( double money ) { return cs->AcceptCash(money); } }; int main() { double price; double number; int type; /* 活动类型 */ cout<<"请输入单价: "; cin>>price; cout<<"请输入数量: "; cin>>number; cout<<"请选择促销活动:"<<endl <<"1 : 正常收费"<<endl <<"2 : 打8折"<<endl <<"3 : 满 300 返 100"<<endl; cin>>type; try { CashContext cashcontext(type); cout<<"总计:"<< price * number<<endl; cout<<"实收现金:"; cout<<cashcontext.GetResult( price * number )<<endl; } catch(exception& e) { cout<<e.what()<<endl; } return 0; }
如果有新的促销活动需要加入,只需再写一个对应的策略类,并在CashContext类中修改部分代码即可实现。
相关文章推荐
- 第2章 商场促销——策略模式 C++实现
- 策略模式加工厂模式实现商场促销 C++
- 通过商场促销来看策略模式+vb.net实现
- 商场收银系统之策略模式学习笔记[C++版]
- 设计模式C++实现(2)——策略模式
- 【设计模式】商场促销 -- 策略模式
- 设计模式C++实现——策略模式
- 设计模式之策略模式的C++实现
- 设计模式C++实现(2)——策略模式
- 《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
- 策略模式 C++ 实现
- 大话设计模式中简单工厂模式和策略模式的商场收银软件实例的C++代码
- 最常用的设计模式-----策略模式(C++实现)
- 设计模式C++实现(2)——策略模式
- 设计模式C++实现(2)——策略模式
- (2)--策略模式【设计模式C++实现】
- 《大话设计模式》——读后感 (2)商场促销?——策略模式
- 读书 大话设计模式 第二章 策略模式 C++实现 1-2小节 未完
- 设计模式C++实现(2)——策略模式
- 设计模式C++实现(2)——策略模式