应用场景
- 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
- 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
- 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
优缺点
策略模式是一种定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。
- 优点:
- 通过策略抽象类,可以析取出所有算法的公共功能,提高代码的重复利用;
- 隐藏了策略的实现细节,使用户无需了解策略的具体细节。
- 缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类;
- 策略模式造成很多的策略类,每个具体的策略类都会产生一个新类。
注意:为了克服缺点一,可以采用策略模式+简单工厂模式的方式。其中,策略模式隐藏策略实现细节,简单工厂模式隐藏了对象创建细节,使得用户在使用时仅需要了解策略的设置工厂类即可,降低了用户压力。
样例
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
//策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)
//实现的各种策略,各种策略的实现类,都必须继承抽象类
//策略的设置接口类,设置不同策略
class CashSuper
{
public:
virtual double acceptMoney(double money) = 0;//抽象类,收钱的纯虚函数
};
class CashNormal :public CashSuper
{
public:
double acceptMoney(double money)//正常收钱
{
return money;
}
};
class CashRebate :public CashSuper //打折
{
private:
double discount;
public:
CashRebate(double dis) //折扣
{
discount = dis;
}
double acceptMoney(double money)//收钱
{
return money*discount;//折扣
}
};
class CashReturn :public CashSuper
{
private:
double moneyCondition;
double moneyReturn;
public:
CashReturn(double mc, double mr)//花多少钱,返回多少钱
{
moneyCondition = mc;
moneyReturn = mr;
}
double acceptMoney(double money)//收钱,返款
{
double result = money;
if (money >= moneyCondition)
{
result = money - floor(money / moneyCondition)*moneyReturn;
}
return result;
}
};
class CashContext
{
private:
CashSuper *cs;
public:
CashContext(CashSuper *cs_)//设置策略
{
cs = cs_;
}
double getResult(double money)
{
return cs->acceptMoney(money);
}
};
int main123 ()
{
double money = 1000;
string stategy = "";
CashSuper *cs = nullptr;
if (stategy == "正常收费")
{
cs = new CashNormal();
}
else if (str == "打9折")
{
cs = new CashRebate(0.9);
}
else if (str == "满1000送200")
{
cs = new CashReturn(1000, 200);
}
CashContext *cc = new CashContext(cs);
cout << cc->getResult(money);
cin.get();
return 0;
}
结合策略模式和简单工厂模式来实现
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class CashSuper
{
public:
virtual double acceptMoney(double money) = 0;//抽象类,收钱的纯虚函数
};
class CashNormal :public CashSuper
{
public:
double acceptMoney(double money)//正常收钱
{
return money;
}
};
class CashRebate :public CashSuper //打折
{
private:
double discount;
public:
CashRebate(double dis) //折扣
{
discount = dis;
}
double acceptMoney(double money)//收钱
{
return money*discount;//折扣
}
};
class CashReturn :public CashSuper
{
private:
double moneyCondition;
double moneyReturn;
public:
CashReturn(double mc, double mr)//花多少钱,返回多少钱
{
moneyCondition = mc;
moneyReturn = mr;
}
double acceptMoney(double money)//收钱,返款
{
double result = money;
if (money >= moneyCondition)
{
result = money - floor(money / moneyCondition)*moneyReturn;
}
return result;
}
};
//context中结合简单工厂模式,隐藏策略实现类的创建过程
class CashContext
{
private:
CashSuper *cs;
public:
CashContext(string str)//设置策略
{
if (str == "正常收费")
{
cs = new CashNormal();
}
else if (str == "打9折")
{
cs = new CashRebate(0.9);
}
else if (str == "满1000送200")
{
cs = new CashReturn(1000, 200);
}
}
double getResult(double money)
{
return cs->acceptMoney(money);
}
};
int main ()
{
double money = 1000;
CashContext *cc = new CashContext("正常收费");
cout << cc->getResult(money);
cin.get();
return 0;
}