策略模式的C++實現——設計模式學習(2)

編程目的:做一個商場收銀軟件,營業員根據客戶所購買商品的單價和數量,向客戶收費。

策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法類與使用算法類之間的耦合[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++虛函數多態機制”的好例子!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章