1、策略模式定义
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到算法的客户。
2、策略模式类图
Client:客户端
Context:需要使用不同策略的类
AbstractStrategy:策略类的公共父类
ConcreteStrategy1、ConcreteStrategy2、ConcreteStrategy3:策略类的子类实现
3、模式的优缺点及使用情况
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了算法类与使用算法类之间的耦合。同时策略模式的Strategy类层次为Context定义了一系列的可重用的算法和行为,继承有助于析取除这些算法中的公共功能。当我们面对不同时间不同流程要对同一数据采用不同的算法操作时,可以考虑用策略模式。
4、应用举例
每到节假日,超市各大卖场都会安排不同程度的促销活动。这些活动五花八门,常见的有折扣型,满额返现等。我们在购物结算时,超市收银台会根据当前的活动状态采用不同的结算策略,这种情况跟策略模式要解决的问题很相似,可以编写如下示意代码:
#include<iostream>
using namespace std;
class SettleAccout{
public:
virtual double resultAlgorithm(double amount) = 0;
};
class Discount:public SettleAccout{
public:
virtual double resultAlgorithm(double amount);
};
double Discount::resultAlgorithm(double amount){
if(amount > 0){
return amount*0.9;
}
return 0;
}
class Reduce:public SettleAccout{
public:
virtual double resultAlgorithm(double amount);
};
double Reduce::resultAlgorithm(double amount){
if(amount >= 300){
return amount-40;
}else if(amount > 0){
return amount;
}
return 0;
}
class Checkout{
public:
void setStrategy(SettleAccout* settleAccout);
double getResult(double amount);
private:
SettleAccout* settleAccout;
};
void Checkout::setStrategy(SettleAccout* settleAccout){
this->settleAccout = settleAccout;
}
double Checkout::getResult(double amount){
return settleAccout->resultAlgorithm(amount);
}
int main(){
Checkout* checkout = new Checkout();
checkout->setStrategy(new Discount());
cout<<"全场九折优惠,买三百,只需付:"<<checkout->getResult(300)<<endl;
cout<<"********************************"<<endl;
checkout->setStrategy(new Reduce());
cout<<"全场满三百返40,买三百,只需付:"<<checkout->getResult(300)<<endl;
return 0;
}