策略模式C++实现

来源:互联网 发布:地图软件下载 编辑:程序博客网 时间:2024/05/22 14:17

类的划分是为了封装,而分类的基础是抽象,所以具有相同属性和功能的对象的抽象集合才是类。

对于简单工厂模式可以解决的问题,当面对算法的时常变动时,可以考虑策略模式;

策略模式封装了算法,适用于“在不同时间应用不同业务规则”的案例;


结合了简单工厂模式的策略模式:

购物费用基类及其三种子类的定义和实现:

strategy.h

#ifndef STRATEGY_H#define STRATEGY_H#include <iostream>#include <string>using namespace std;class CashSuper{public:virtual double acceptMoney(double money){return money;}};//正常收费class CashNormal:public CashSuper{public:double acceptMoney(double money);};//打折子类class CashRebate:public CashSuper{public:CashRebate(double mRebate):moneyRebate(mRebate){}//构造函数初始化列表double acceptMoney(double money);private://打折率double moneyRebate;};//返利子类class CashReturn:public CashSuper{public:CashReturn(double mCondition,double mReturn):moneyCondition(mCondition),moneyReturn(mReturn){}//构造函数初始化列表double acceptMoney(double money);private://两个成员变量double moneyCondition;//返利条件double moneyReturn;//返利数目};#endif
strategy.cpp

#include "strategy.h"double CashNormal::acceptMoney(double money){return money;}//打折子类实现double CashRebate::acceptMoney(double money){return money*moneyRebate;}//返利子类实现double CashReturn::acceptMoney(double money){if(money >= moneyCondition)    {int temp=money/moneyCondition;return money-temp*moneyReturn;}return money;}

结合了简单工厂模式的context类,用于维护对一个策略对象的引用:

strFactory.h

#ifndef CASHCONTEXT_H#define CASHCONTEXT_H#include "strategy.h"class CashContext{private://维护一个策略类CashSuper *cs;public://根据客户的选择来实例化该策略工厂//构造函数CashContext(char type);double GetResult(double money);};#endif

strFactory.cpp
#include "strFactory.h"CashContext::CashContext(char type){switch(type){case 'N':cs=new CashNormal();break;case 'B':cs=new CashRebate(0.8);break;case 'R':cs=new CashReturn(300,100);break;}}double CashContext::GetResult(double money){return cs->acceptMoney(money);}

客户端代码:

#include "strFactory.h"int main(){char ch;double money;double output[3];int i=0;while(cin >> ch >> money){CashContext *cs = new CashContext(ch);output[i++]=cs->GetResult(money);delete cs;}for(int j=0;j<i;j++)cout << output[j] << endl;return 0;}

0 0
原创粉丝点击