狂言设计模式中简单工厂模式和策略模式的商场收银软件实例的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;
}