大话设计模式——策略模式(C++实现)

来源:互联网 发布:淘宝消保加入步骤图 编辑:程序博客网 时间:2024/04/28 02:23

用C++实现了《大话设计模式》中的策略模式(Strategy)


Strategy.h:

#ifndef _STRATEGY_H#define _STRATEGY_H#include <iostream>using namespace std;class CCashBase{public:virtual double ReturnMoney(double money)=0;protected:private:};class CCashNomal : public CCashBase{public:double ReturnMoney(double money);protected:private:};class CCRebate : public CCashBase{public:CCRebate(double rebate):m_dMoneyRebate(rebate){};double ReturnMoney(double money);protected:private:double m_dMoneyRebate;};class CCReturn : public CCashBase{public:CCReturn(double moneyCondition,double moneyReturn):m_dMoneyCondition(moneyCondition),m_dMoneyReturn(moneyReturn){};double ReturnMoney(double money);protected:private:double m_dMoneyCondition,m_dMoneyReturn;};//策略模式class CCashContext1{public:CCashContext1(CCashBase *cb);double GetResult(double money);protected:private:CCashBase *m_pCB;};//策略与简单工厂模式结合class CCashContext2{public:CCashContext2(int i);double GetResult(double money);protected:private:CCashBase *m_pCB;};#endif

Strategy.cpp:

#include "Strategy.h"/************************************************************************//* CCashNomal类                                                         *//************************************************************************/double CCashNomal::ReturnMoney( double money ){return money;}/************************************************************************//* CCRebate类                                                           *//************************************************************************/double CCRebate::ReturnMoney( double money ){return money * m_dMoneyRebate;}/************************************************************************//* CCReturn类                                                           *//************************************************************************/double CCReturn::ReturnMoney( double money ){double result = money;if (money >= m_dMoneyCondition)result = money - int(money/m_dMoneyCondition) * m_dMoneyReturn;return result;}/************************************************************************//* CCashContext1类                                                      *//************************************************************************/CCashContext1::CCashContext1( CCashBase *cb ){m_pCB = cb;}double CCashContext1::GetResult( double money ){return m_pCB->ReturnMoney(money);}/************************************************************************//* CCashContext2类                                                      *//************************************************************************/CCashContext2::CCashContext2( int i ){switch(i){case 1:m_pCB = new CCashNomal;break;case 2:m_pCB = new CCReturn(300,100);break;case 3:m_pCB = new CCRebate(0.8);break;default:m_pCB = new CCashNomal;}}double CCashContext2::GetResult( double money ){return m_pCB->ReturnMoney(money);}

#include <iostream>#include "Strategy.h"using namespace std;int main(){//策略模式CCashContext1 *pCT1 = NULL;cout<<"请选择折扣:"<<endl;cout<<"1.正常"<<endl;cout<<"2.满300返100"<<endl;cout<<"3.打8折"<<endl;int i;cin>>i;switch (i){case 1:pCT1 = new CCashContext1(new CCashNomal);break;case 2:pCT1 = new CCashContext1(new CCReturn(300,100));break;case 3:pCT1 = new CCashContext1(new CCRebate(0.8));break;default:pCT1 = new CCashContext1(new CCashNomal);}cout<<pCT1->GetResult(500)<<endl;//策略与简单工厂模式结合//客户端只需要认识一个CCashContext2类,耦合更加降低CCashContext2 *pCT2 = new CCashContext2(i);cout<<pCT2->GetResult(500)<<endl;delete []pCT1,pCT2;return 0;}



0 0
原创粉丝点击