您的位置:首页 > 编程语言 > C语言/C++

策略模式---商场促销(C++实现)

2014-01-11 15:36 656 查看
        策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它(策略模式)可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类的之间的耦合。

        策略模式就是用来封装算法的,但在实践中,可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。



[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类中修改部分代码即可实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: