1. 程式人生 > >大話設計模式中簡單工廠模式和策略模式的商場收銀軟體例項的C++程式碼

大話設計模式中簡單工廠模式和策略模式的商場收銀軟體例項的C++程式碼

策略模式是一種定義一系統演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是具體的實現不同;策略模式可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。

策略模式是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規則,只要在分析過程中遇到需要在不同時間應用的業務原則,就可以考慮策略模式來處理這種變化的可能性。

當不同的行為堆砌在一起時,難免會使用條件語句來選擇合適的行為。將這些行為封裝在一個個獨立的策略演算法中,可以在使用這些行為的類中消除條件語句。

需求:商場可能會搞各種活動,甚至每一種商品都會打折,還會有諸如滿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;
}