策略模式

来源:互联网 发布:创维25nd9000总线数据 编辑:程序博客网 时间:2024/05/29 14:58

经过一个礼拜的休息,重新开始设计模式的学习。

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

再定义一个上下文(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;                   //原来的jiagedouble 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;elsereturn 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减20default: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减20default: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减20cout<<"满100减20收款:"<<accept->AcceptMoney(100)<<endl;return 0;}


原创粉丝点击