策略模式
前序
請實現一個商場收銀軟件,包含正常收費,打折收費和返利收費三種具體策略
策略模式
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
實現方式(UML類圖)

實現代碼
#include <stdio.h>
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
{
protected:
double moneyRebate;
public:
CashRebate() : moneyRebate(1){}
CashRebate(double _moneyRebate) : moneyRebate(_moneyRebate){}
virtual double acceptCash(double money)
{
return money * moneyRebate;
}
};
class CashReturn : public CashSuper
{
protected:
double moneyCondition;
double moneyReturn;
public:
CashReturn() : moneyCondition(0),moneyReturn(0){}
CashReturn(double _moneyCondition,double _moneyReturn)
: moneyCondition(_moneyCondition),moneyReturn(_moneyReturn)
{}
virtual double acceptCash(double money)
{
double result = money;
if(money >= moneyCondition) result -= (int)(money / moneyCondition) * moneyReturn;
return result;
}
};
class CashContext
{
protected:
CashSuper* cs;
public:
CashContext() : cs(0){}
~CashContext()
{
if(cs) delete cs;
}
CashContext& operator=(CashSuper* csuper)
{
if(cs) delete cs;
cs = csuper;
return *this;
}
double GetResult(double money)
{
return cs->acceptCash(money);
}
};
int main()
{
double total = 0;
int Type;
while(1)
{
printf("請輸入收費方式(0~2,-1退出):");
scanf("%d",&Type);
if(Type == -1) break;
CashContext cc;
switch(Type)
{
case 0:
cc = new CashNormal();
break;
case 1:
cc = new CashReturn(300,100);
break;
case 2:
cc = new CashRebate(0.8);
break;
default:
cc = new CashNormal();
break;
}
double Price,Num;
printf("請輸入單價:");
scanf("%lf",&Price);
printf("請輸入數量:");
scanf("%lf",&Num);
total += cc.GetResult(Price * Num);
}
printf("總價:%f\n",total);
return 0;
}
運行結果

所有文件打包下載
posted on 2011-05-04 15:10
lwch 閱讀(1358)
評論(0) 編輯 收藏 引用 所屬分類:
設計模式