策略模式是一种定义一系统算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是具体的实现不同;策略模式可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中遇到需要在不同时间应用的业务原则,就可以考虑策略模式来处理这种变化的可能性。
当不同的行为堆砌在一起时,难免会使用条件语句来选择合适的行为。将这些行为封装在一个个独立的策略算法中,可以在使用这些行为的类中消除条件语句。
需求:商场可能会搞各种活动,甚至每一种商品都会打折,还会有诸如满300减100的其它优惠活动,因此收银时都需要考虑这些情况,甚至要考虑怎样处理期货的活动,比如遇到节日时搞个折上折等等。
下面为整个的代码,不足之处还请指正:
/* 策略模式的例子实现 2012-11-08 */
#include <iostream>
#include <string>
using namespace std;
class CashSuper{
public:
virtual double acceptCash(double money) = 0;
};
class CashNormal:public CashSuper{
public:
double acceptCash(double money)
{
return money;
}
};
class CashRebate:public CashSuper
{
private:
double moneyRebate;
public:
CashRebate(double moneyRebate)
{
this->moneyRebate = moneyRebate;
}
double acceptCash(double money)
{
return money * moneyRebate;
}
};
class CashReturn : public CashSuper
{
private:
double moneyCondition ;
double moneyReturn;
public:
CashReturn(double moneyCondition,double moneyReturn)
{
this->moneyCondition = moneyCondition;
this->moneyReturn = moneyReturn;
}
double acceptCash(double money)
{
double result = money;
if( money >= moneyCondition ) {
result = money - (money/moneyCondition)*moneyReturn;
}
return result;
}
};
//CaseContext类
class CashContext {
private:
CashSuper *cs;
public:
CashContext(CashSuper *csuper)
{
this->cs = csuper;
}
CashContext( int type )
{
switch(type){
case 1: //正常模式
cs = new CashNormal();
break;
case 2: //满三百减一百
cs = new CashReturn(300,100);
break;
case 3: //八折
cs = new CashRebate(0.8);
break;
}//switch
}
double GetResult ( double money )
{
return cs->acceptCash(money);
}
~CashContext()
{
delete cs;
}
};
int main()
{
double total = 0;
CashContext *csuper = new CashContext(2);
double totalPrices = 0;
totalPrices = csuper->GetResult(300.0);
total = total+totalPrices;
cout << " total = "<<total<<endl;
return 0;
}