今天来学习一下策略模式,拿起大话设计模式这本书,陡然一看这个策略模式和工厂模式有点像,先来看看C++的代码实现。
#include <iostream>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
class CashSuper
{
public:
virtual double acceptCash(double money) {return money;}
};
class CashNormal : public CashSuper
{
public:
double acceptCash(double money)
{
return money;
}
};
class CashRebate : public CashSuper
{
public:
CashRebate(double Rebate)
{
moneyRebate = Rebate;
}
double acceptCash(double money)
{
return money * moneyRebate;
}
private:
double moneyRebate;
};
class CashReturn : public CashSuper
{
public:
CashReturn(double Condition,double Return)
{
moneyCondition = Condition;
moneyReturn = Return;
}
double acceptCash(double money)
{
double result = money;
if(money >= moneyCondition)
{
result = money - floor(money / moneyCondition) * moneyReturn;
}
return result;
}
private:
double moneyCondition;
double moneyReturn;
};
class CashContext
{
public:
CashContext(int type)
{
switch(type)
{
case 0:
cs = new CashNormal();
break;
case 1:
cs = new CashReturn(300,100);
break;
case 2:
cs = new CashRebate(0.8);
break;
}
}
double GetResult(double money)
{
return cs->acceptCash(money);
}
private:
CashSuper *cs;
};
int main()
{
CashContext *p = new CashContext(0);
double totalPrice = p->GetResult(100);
cout << totalPrice << endl;
delete p;
return 0;
}
看到代码,你发现CashContext就像一个工厂。其实没错,这个代码就是一个策略模式和工厂模式的组合。代码是一个商场促销的策略模式,有正常收费,打折收费,返利收费。由收费对象选择哪一种收费方式。CashContext是工厂模式,策略模式体现在GetResult()函数,它通过传入不同的对象选择调用不同算法,也就是调用不同的获取结果的函数。
策略模式是行为模式,它的作用是让一个对象在许多行为种选择一种行为。GetResult()就可以通过对象不同来进行选择,让策略的变化独立于使用策略的用户。