/*****This file is to implement a cashier system*****/
/*****Basic Function:Choose Fruit*****/
/*****Basic Funciton:Choose Valuation Method******/
/*****Author:liangmz******/
/*****Date:2017/09/28*****/
/******策略模式的应用*****/
#include <iostream>
#include <stdlib.h>
#include <vector>
enum EValuation
{
NO_DISCOUNT=0,
DISCOUNT,
MEETMINUS
};
using namespace std;
class CFruits
{
private:
double t_count;
double t_price;
public:
void SetCount(double count)
{
t_count =count;
}
void SetPrice(double price)
{
t_price =price;
}
double GetPrice()
{
return this->t_price;
}
double GetCount()
{
return this->t_count;
}
};
class CFruitBasket
{
private:
vector <CFruits> m_vfruits;
double m_total;
public:
CFruitBasket(vector <CFruits> vfruits)
{
m_vfruits = vfruits;
m_total = 0;
}
virtual ~CFruitBasket()
{
}
void SetFruit(vector <CFruits> fruits)
{
m_vfruits = fruits;
}
virtual double GetTotal()
{
for(vector<CFruits>::iterator iter=m_vfruits.begin();iter!=m_vfruits.end();iter++)
{
cout<<(*iter).GetCount()<<endl;
m_total += (*iter).GetPrice()*(*iter).GetCount();
}
return m_total;
}
};
class CDiscount:public CFruitBasket
{
private:
double m_rate;
public:
CDiscount(vector <CFruits> vfruits,double rate):CFruitBasket(vfruits)
{
m_rate =rate;
}
double GetRate()
{
cout << "Rate is :"<<m_rate<<endl;
return this->m_rate;
}
virtual double GetTotal()
{
double ret = CFruitBasket::GetTotal()*m_rate;
return ret;
}
};
class CMeetMinus:public CFruitBasket
{
private:
double m_least;
double m_minus;
public:
CMeetMinus(vector <CFruits> vfruits,double least,double minus):CFruitBasket(vfruits)
{
m_least= least;
m_minus = minus;
}
double GetMinus()
{
return m_minus;
}
double GetLeast()
{
return m_least;
}
double GetTotal()
{
double ret = CFruitBasket::GetTotal();
if(ret>m_least)
{
return (ret-m_minus);
}
else
return ret;
}
};
class CValuation
{
private:
CFruitBasket *m_pbasket;
public:
CValuation(vector <CFruits> vfruits,EValuation etype)
{
switch(etype)
{
case NO_DISCOUNT:
m_pbasket = new CFruitBasket(vfruits);
break;
case DISCOUNT:
m_pbasket = new CDiscount(vfruits,0.8);
break;
case MEETMINUS:
m_pbasket = new CMeetMinus(vfruits,100,20);
break;
default:
m_pbasket = NULL;
cout<<"Input error!"<<endl;
break;
}
}
double GetTotal()
{
if(m_pbasket==NULL)
{
cout<<"Empty basket"<<endl;
return 0;
}
else
{
cout<<"Calculate over!!!"<<endl;
return m_pbasket->GetTotal();
}
}
};
int main()
{
CFruits Apple;
Apple.SetPrice(4);
Apple.SetCount(5);
cout << "Apple Price is :"<<Apple.GetPrice()<<endl;
CFruits Orange;
Orange.SetPrice(3);
Orange.SetCount(10);
cout << "Orange Price is :"<<Orange.GetPrice()<<endl;
CFruits Durian;
Durian.SetPrice(18.8);
Durian.SetCount(5);
cout << "Durian Price is :"<<Durian.GetPrice()<<endl;
vector <CFruits> vfruits;
vfruits.push_back(Apple);
vfruits.push_back(Orange);
vfruits.push_back(Durian);
cout<<"Please enter your choice:"<<endl;
int in;
cin>>in;
CValuation guestA(vfruits,(EValuation)in);
cout<<"Total is :"<<guestA.GetTotal()<<endl;
return 0;
}
前一篇利用了类似于简单工厂的模式实现了超市收银功能,实际上类似的场景更使用策略模式,代码需要稍作修改,具体如下