デザインモードの策略パターン学習

7102 ワード

策略のモード:それは計算方の家族を定義して、それぞれカプセル化して、彼の間に互いに交替することができます.このモードはアルゴリズムを変化させ、これらのアルゴリズムを使用するクライアントに影響を与えない.
引き出し戦略モードでは、スーパーのレジシステムについて議論しました.各種の料金項目をいくつかの操作に抽象化できます.例えば、通常の料金、割引、現金還付、ポイント還付などです.割引にとって、なぜこのように抽象的にできるかというと、各種割引の間には相互の関係がありますから、抽象的なものを一つにします.現在に戻り、ポイントを返すのも似ています.
アルゴリズム自体はポリシーであり、これらのアルゴリズムは常に置換されるかもしれない.これは変化点であり、パッケージの変化点はオブジェクトに向けた非常に重要な考え方である.
戦略モードは、一連のアルゴリズムを定義する方法であり、概念的には、これらすべてのアルゴリズムが同じ作業を完了することを見て、異なることを実現するだけである.これは、すべてのアルゴリズムを同じ方法で呼び出すことができ、様々なアルゴリズムクラスとそのアルゴリズムクラスとの間の結合を低減する.
コードを見る:
//有料対象虚基類.
class SuperCashier
{
public:
	double price;
	int num;
public:
	SuperCashier(double price,int num)
	{
		this->price=price;
		this->num=num;

	}
	virtual double getTotalMoney()=0; 

} ;
//通常料金
class Normal:public SuperCashier
{
public:

	double discount;
public:
	Normal(double price,int num)
		:SuperCashier(price,num)
	{

	}
	virtual double getTotalMoney()
	{
		return price*num;
	}

} ;
//   
class Discount:public SuperCashier
{
public:

	double discount;
public:
	Discount(double price,int num,double discount)
		:SuperCashier(price,num)
	{
		this->discount=discount;
	}
	virtual double getTotalMoney()
	{
		return price*num*discount;
	}

} ;
//   
class ReturnPoint :public SuperCashier
{
public:
	double conditionMoney;
	double point;
public :
	ReturnPoint(double price,double num,double cm,double rp)
		:SuperCashier(price,num),conditionMoney(cm),point(rp)
	{

	} 
	virtual double getTotalMoney()
	{
		double total=price*num;
		if(total>=conditionMoney)
		{
			double n=total/conditionMoney;
			return point*n;

		} 
		return 0;
	} 

};

//   
class ReturnMoney:public SuperCashier
{
public:
	double conditionMoney;
	double returnNum;
public:
	ReturnMoney(double price,double num,double cm,double returnNum)
		:SuperCashier(price,num),conditionMoney(cm)
	{
		this->returnNum=returnNum;
	}
	virtual double getTotalMoney()
	{
		double total=num*price;
		if(total>=conditionMoney)
		{
			double n=total/conditionMoney;
			return total-n*returnNum;
		}
	}
} ;


/************************************************************************/
/*     。                                                             */
/***********************************************************************
class CashContext
{
public:
	SuperCashier*sc;
public:
	CashContext(SuperCashier*sc)
	{
		this->sc=sc;
	}
	double getResult()
	{
		return sc->getTotalMoney();
	}


};
//        。
int main(int argc,char**argv)
{
	double price;
	double num;
	CashContext *cc; 
	while(1)
	{
		cout<>ch;getchar();
		switch(ch)
		{
		case 1:
			{
				cin>>price>>num;
				cc=new CashContext(new Normal(price,num));


			}
			break;
		case 2:
			{
				double discount;
				cin>>price>>num>>discount;
				cc=new CashContext(new Discount(price,num,discount));
			}
			break;
		case 3:
			{
				double conditionMoney;
				double returnPoint;
				cin>>price>>num>>conditionMoney>>returnPoint;
				cc=new CashContext(new ReturnPoint(price,num,conditionMoney,returnPoint));
			}
			break;
		case 4:
			{
				double conditionMoney;
				double returnMoney;
				cin>>price>>num>>conditionMoney>>returnMoney;
		           cc=new CashContext(new ReturnMoney(price,num,conditionMoney,returnMoney));
			}
			break;
		default:
			break;
		} 
		cout<getResult()<


/************************************************************************/
/*              ,   main  switch    CashContext         */
/************************************************************************/
class CashContext
{
public:
	int type;
	double price;
	double num;
	double discount;
	double conditionMoney;
	double ret;
	SuperCashier *sc;
public:
	CashContext(int t,double price,int num,double discount)
		:type(t)
	{
		this->price=price;
		this->num=num;
		this->discount=discount;
		
		sc=NULL;
	}
	CashContext(int t,double price,int num)
		:type(t)
	{
		this->price=price;
		this->num=num;
		sc=NULL;
	}
	CashContext(int t,double price,int num,double conditionMoney,double ret)
		:type(t)
	{
		this->price=price;
		this->num=num;
		this->conditionMoney=conditionMoney;
		this->ret=ret;
		sc=NULL;
	}
	double getResult()
	{
		
		switch(type)
		{
		case 1://    
			{
				sc=new Normal(price,num);
			}
			break;
		case 2://  
			{
				sc=new Discount(price,num,discount);
			}
			break;
		case 3://  
			{
				sc=new ReturnPoint(price,num,conditionMoney,ret);
			}
			break;
		case 4://  
			{
				sc=new ReturnPoint(price,num,conditionMoney,ret);
			}
			break;
		default:
			break;
		}
		return sc->getTotalMoney();

	}
};
int main(int argc,char**argv)
{
	CashContext *cc;
	double price,num,discount,conditionMoney,ret;

	cin>>price>>num;
	cc=new CashContext(1,price,num);
	cout<getResult()<>price>>num>>discount;
	cc=new CashContext(2,price,num,discount);
	cout<getResult()<>price>>num>>conditionMoney>>ret;
	cc=new CashContext(3,price,num,conditionMoney,ret);
	cout<getResult()<>price>>num>>conditionMoney>>ret;
	cc=new CashContext(4,price,num,conditionMoney,ret);
	cout<getResult()<
 
  

, ,CashContext switch , 。 。 。 ,

: , 。 , 。 , 。 。