策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况。就像上面的加班工资,不同的加班情况,有不同的算法。我们不能在程序中将计算工资的算法进行硬编码,而是能自由的变化的。这就是策略模式。
UML图:
使用场景:
1、许多相关的类仅仅是行为有异,“策略”提供了一种用多个行为中的一种来配置一个类的方法。
2、
需要一个算法的不同变体。
3、
一个类定义了多种行为,并且这些行为在类中的操作以多个条件语句的形式出现,将相关的条件分支移入它们各自的strategy类中代替这些条件语句,但是这样又把分支判断放回了客户端,此时一般将策略模式与简单工厂模式相结合,简化客户端的代码复杂度。
C++源码:
//策略模式
#include<iostream>
using namespace std;
typedef enum strategy_type
{
strategy_A,
strategy_B
}STRATEGYTYPE;
class strategy
{
public:
virtual void show_strategy(){}
virtual ~strategy(){}
};
class strategyA:public strategy
{
public:
void show_strategy(){cout<<"strategy A"<<endl;}
~strategyA(){}
};
class strategyB:public strategy
{
public:
void show_strategy(){cout<<"strategy B"<<endl;}
~strategyB(){}
};
class context
{
public:
context(STRATEGYTYPE strategy_type)
{
switch(strategy_type)
{
case strategy_A:
sty = new strategyA();
break;
case strategy_B:
sty = new strategyB();
break;
default:
break;
}
}
public:
void get_strategy()
{
sty->show_strategy();
}
strategy *sty;
};
int main()
{
strategy *sty;
context *cnt=new context(strategy_A);
cnt->get_strategy();
cnt=new context(strategy_B);
cnt->get_strategy();
return 0;
}