編程目的:做一個商場收銀軟件,營業員根據客戶所購買商品的單價和數量,向客戶收費。
策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法類與使用算法類之間的耦合[DPE]。
策略模式的優點:
算法時常改變,它定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化不會影響使用算法的客戶。
簡化了單元測試,因爲每個算法都有自己的類,可以通過自己的接口單獨測試[DPE]。
#include <iostream>
#include <stdexcept>
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(std::logic_error("沒有這種促銷活動"));
}
}
~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;
}
這個策略模式的例子也是學習“c++虛函數多態機制”的好例子!