策略模式是一种行为设计模式,它定义类一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法 的变化不会影响使用算法 的客户端。
主要组成
-
策略接口 (Strategy Interface)
- 定义所有支持的算法或行为的公共接口
-
具体策略类 (Concrete Strategies)
- 实现策略接口的具体算法或行为
-
上下文类 (Context)
-
持有一个策略对象的引用
-
提供一个接口让策略对象访问其数据
-
可以定义一个接口让策略对象返回计算结果
-
优点
-
开闭原则:可以在不修改上下文类的情况下引入新策略
-
消除条件语句:避免使用大量的条件语句来选择不同的算法
-
算法复用:可以在不同的环境中复用相同的策略
适用场景
-
当需要在运行时选择不同的算法变体时
-
当一个类有多种行为,且这些行为以多个条件语句的形式出现时
-
当需要隔离算法的实现细节与使用它的代码时
代码比较
非策略模式代码
class doWorkClass
{
int doWork()
{
if (...) {
...
}
else if (...) {
...
}
.
.
//每增加一种算法就往后面添加if else 违背了开闭原则,
}
};
策略模式代码
//基类
class doWorkBase
{
public:
virtual int doWork() = 0;
virtual ~doWorkBase();
};
//继承类,重写虚函数实现
class doWorkClass1 : public doWorkBase {
public:
int doWork() override
{
......
}
};
class doWorkClass2 : public doWorkBase {
public:
int doWork() override
{
......
}
};
//调用类,通过调用不同的子类对象实现不同的算法
class workClass
{
public:
void setDoWork(doWorkBase * doWork)
{
m_pDoWork = doWork;
}
void doWork()
{
m_pDoWork->doWork();
}
private:
doWorkBase *m_pDoWork;
};