策略模式
-
一个类的行为或其算法可以在运行时更改
-
UML类图:
例子:
促销策略
class SaleStrategy
{
public:
virtual void SaleWay() = 0;
};
class StrategyA :public SaleStrategy
{
public:
virtual void SaleWay()
{
cout << "打8折" << endl;
}
};
class StrategyB :public SaleStrategy
{
public:
virtual void SaleWay()
{
cout << "满200元,反现金100" << endl;
}
};
策略使用者
class Salesman
{
public:
void SetStrategy(SaleStrategy* strategy)
{
m_strategy = strategy;
}
void Yell()
{
m_strategy->SaleWay();
}
SaleStrategy* m_strategy;
};
调用:
int main(void)
{
SaleStrategy* strategy1 = NULL;
Salesman julian;
strategy1 = new StrategyA; //策略1
julian.SetStrategy(strategy1);
julian.Yell();
cout << "--------------" << endl;
strategy1 = new StrategyB; //策略2
julian.SetStrategy(strategy1);
julian.Yell();
return 0;
}
结果:先使用策略A , 然后使用策略B
- 优点:
(1) 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
(2)策略模式提供了一种算法的复用机制。由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类
(3 )使用策略模式可以避免多重条件选择语句,多重条件选择语句不易维护。
-
缺点:
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
(2)策略模式将造成系统产生很多具体策略类。
-
使用场景:
准备一组算法,并将每一个算法封装起来,使得它们可以互换。