策略模式
(1)策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
(2)主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
(3)UML图:
(4)在策略模式结构图中包含如下几个角色:
● Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
● Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。
● ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
(5)完整可运行的源码:
#include<iostream>
//抽象的算法类
class XStrategy
{
public:
virtual void algorithmInterface() = 0;
};
//具体的算法类
class Strategy1 :public XStrategy
{
public:
void algorithmInterface() override
{
std::cout << "use method 1" << std::endl;
}
};
//具体的算法类
class Strategy2 :public XStrategy
{
public:
void algorithmInterface() override
{
std::cout << "use method 2" << std::endl;
}
};
//context类:维护一个算法类实例
class Context
{
public:
Context(XStrategy* strategy) { maStrategy = strategy; }
void ContextInterface()
{
maStrategy->algorithmInterface();
}
private:
XStrategy * maStrategy;
};
int main()
{ //给Context类切换不同的算法
Context* context = new Context(new Strategy1);
context->ContextInterface();
context = new Context(new Strategy2);
context->ContextInterface();
return 0;
}
(6)运行截图:
(7)策略模式的优缺点:
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
(8)使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。