您的位置:首页 > 其它

策略模式

2013-06-03 16:57 330 查看
经过一个礼拜的休息,重新开始设计模式的学习。

今天学习的是策略模式,策略模式运用的就是面向对象的”多态思想“,首先定义一个策略基类,并定义所有的子类需要的接口,然后在基类的基础之下定义具体的策略类。

再定义一个上下文(context)类,这个类中只出现策略基类。运用基类的策略基类的指针来指向他的子类,并根据不同策略更改指向的子类。这样就可以选择具体的策略了。

从而实现新增加一种策略后只要在context中增加几行代码就可以运用新增加的策略类中的算法了。

不多说了,上代码:

// StrategyModel.cpp : 定义控制台应用程序的入口点。
//

//策略模式
#include "stdafx.h"
#include <iostream>
using namespace std;

/*
*需求:某商场收银软件,在节假日有各种优惠需
*求,打折需求种类随时间或者是销售策略变化,
*请用面向对象思想设计一个软件。
*/

//收银基类,策略类
class CashSuper
{
public:
CashSuper(){}
CashSuper(double Discount):Discount(Discount){}
virtual double FinalMoney(double Original) = 0; //定义一个纯虚函数,用来决定往下调用哪个函数
protected:
double Original; //原来的jiage
double Discount; //折扣或者满多少返多少
};

//普通的收银类,即没有任何优惠
class CashNormal:public CashSuper
{
public:
CashNormal():CashSuper(){}
virtual double FinalMoney(double Original){return Original;}
};

//打折的收银类,即按某件商品在原价的基础之上打多少折扣
class CashRebate:public CashSuper
{
public:
CashRebate(double Discount):CashSuper(Discount){}
virtual double FinalMoney(double Original)
{
double temp = Original * Discount;
return temp;
}
};

//返回的收银类,即买完商品总价总计满多少之后减多少
class CashReturn:public CashSuper
{
public:
CashReturn(double Discount,double DiscountRequire):CashSuper(Discount),DiscountRequire(DiscountRequire){}
virtual double FinalMoney(double Original)
{
if( Original >= DiscountRequire )
return Original - Discount;
else
return Original;
}
private:
double DiscountRequire;
};

//上下文类,用来选择哪种类,哪种收款方式
class Context
{
public:
Context(){}
Context(int Choice)
{
this->Choice = Choice;
switch(this->Choice)
{
case 0:AcceptWay = new CashNormal(); break; //正常收费
case 1:AcceptWay = new CashRebate(0.5);break; //打5折
case 2:AcceptWay = new CashReturn(20.0,100);break; //满100减20
default:break;
}
}
void ReChoicePayWay(int Choice)
{
this->Choice = Choice;
delete AcceptWay;
switch(this->Choice)
{
case 0:AcceptWay = new CashNormal(); break; //正常收费
case 1:AcceptWay = new CashRebate(0.5);break; //打5折
case 2:AcceptWay = new CashReturn(20,100.0);break; //满100减20
default:break;
}
}
double AcceptMoney(double Original){ double temp = AcceptWay->FinalMoney(Original);return temp; }
private:
CashSuper *AcceptWay;
int Choice;
};

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"原价100:100"<<endl;
Context* accept = new Context(0); //表示不打折买东西
double Temp = accept->AcceptMoney(100);
cout<<"正常收款:"<<Temp<<endl; //收款100百
accept->ReChoicePayWay(1); //表示打5折
cout<<"打5折收款:"<<accept->AcceptMoney(100)<<endl;
accept->ReChoicePayWay(2); //满100减20
cout<<"满100减20收款:"<<accept->AcceptMoney(100)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息