设计模式——策略模式

89 阅读2分钟

定义

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,定义一组算法,将每个算法封装起来,并使它们可以相互替换。

实现

#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可以使用不同的策略来应对不同的情况,例如攻击、逃跑、寻找资源等。
  • 数据压缩算法:不同的数据压缩算法对于不同类型的数据可能会产生不同的效果,使用策略模式可以方便地选择合适的压缩算法。

总之,策略模式适用于任何需要在多个算法之间进行选择的场景,特别是当这些算法可能需要经常更改时。