定义
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,定义一组算法,将每个算法封装起来,并使它们可以相互替换。
实现
#include <iostream>
using namespace std;
// 抽象策略类
class Strategy {
public:
virtual void execute() = 0;
};
// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
void execute() {
cout << "执行策略A" << endl;
}
};
// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
void execute() {
cout << "执行策略B" << endl;
}
};
// 环境类
class Context {
public:
Context(Strategy* strategy) {
this->strategy = strategy;
}
void setStrategy(Strategy* strategy) {
this->strategy = strategy;
}
void executeStrategy() {
this->strategy->execute();
}
private:
Strategy* strategy;
};
int main() {
Strategy* strategyA = new ConcreteStrategyA();
Strategy* strategyB = new ConcreteStrategyB();
Context* context = new Context(strategyA);
context->executeStrategy();
context->setStrategy(strategyB);
context->executeStrategy();
delete strategyA;
delete strategyB;
delete context;
return 0;
}
策略方法模式特点
优点:
- 体现了单一职责原则:每个策略类负责实现对应会员等级的计算方法。
- 体遵循了开闭原则:使用了策略模式之后,如果又新出了一个会员等级,只需针对新增的等级实现一个策略类即可,不需要修改原有的代码。
缺点:
- 首先是类增多了,这个也是大部分设计模式的通病了;
- 其次,客户在使用的时候必须知道所有的策略类,并自行决定使用哪一个策略类,就拿文中的例子来说,如果我们需要计算超级会员的价格,new StrategyContext(new SuperMemberCalculateStrategy()),必须知道SuperMemberCalculateStrategy这个类是用来计算超级会员的价格的。
策略模式的应用场景
策略模式适用于需要在多种算法之间进行选择的情况,例如:
- 排序算法:不同的排序算法对于不同类型的数据可能会产生不同的效果,使用策略模式可以方便地选择合适的排序算法。
- 支付方式:在电商网站中,用户可以选择不同的支付方式(如信用卡、支付宝等),使用策略模式可以方便地实现不同的支付方式。
- 缓存策略:缓存可以使用不同的策略,例如基于时间的缓存、基于容量的缓存等,使用策略模式可以方便地切换不同的缓存策略。
- 游戏中的AI策略:在游戏中,AI可以使用不同的策略来应对不同的情况,例如攻击、逃跑、寻找资源等。
- 数据压缩算法:不同的数据压缩算法对于不同类型的数据可能会产生不同的效果,使用策略模式可以方便地选择合适的压缩算法。
总之,策略模式适用于任何需要在多个算法之间进行选择的场景,特别是当这些算法可能需要经常更改时。