面对未来的变化应该是增加新代码,而不是改变原先的代码
// Strategy 抽象策略类
class Strategy {
public:
virtual ~Strategy() {};
virtual void AlgorithmInterface() = 0; // 定义算法接口
};
// ConcreteStrategy 具体策略类
class ConcreteStrategyA : public Strategy {
public:
void AlgorithmInterface() override {
cout << "算法A实现" << endl;
}
};
class ConcreteStrategyB : public Strategy {
public:
void AlgorithmInterface() override {
cout << "算法B实现" << endl;
}
};
class ConcreteStrategyC : public Strategy {
public:
void AlgorithmInterface() override {
cout << "算法C实现" << endl;
}
};
// Context 环境类
class Context {
public:
Context(Strategy* strategy) : m_strategy(strategy) {}; // 通过构造函数传入具体策略对象
~Context() { delete m_strategy; } // 释放内存
void AlgorithmInterface() { // 调用策略对象的算法接口
m_strategy->AlgorithmInterface();
};
private:
Strategy* m_strategy; // 维护一个对抽象策略类的引用
};
// 测试代码
int main() {
Strategy* concreteStrategyA = new ConcreteStrategyA(); // 创建具体策略对象
Strategy* concreteStrategyB = new ConcreteStrategyB();
Strategy* concreteStrategyC = new ConcreteStrategyC();
Context* contextA = new Context(concreteStrategyA); // 创建环境类对象,并传入具体策略对象
Context* contextB = new Context(concreteStrategyB);
Context* contextC = new Context(concreteStrategyC);
contextA->AlgorithmInterface(); // 调用环境类对象的方法,执行不同的算法
contextB->AlgorithmInterface();
contextC->AlgorithmInterface();
delete contextA; // 释放内存
delete contextB;
delete contextC;
return 0;
}
这个方法就是定义一个算法的基类,用子类去实现算法的具体,定义一个操控他们的类,在里面维护一个他们的父类传入他们的指针,然后在一个方法中去调用他们对应的算法,根据C++的多态性就会去掉用他们的具体实现,这种方法好在当需要增加一个新的算法时可以不用去更改原先的代码而是增加代码
bing:
策略模式是一种行为型设计模式,它将一组行为或算法封装成不同的类,让它们可以相互替换,以适应不同的情况。策略模式的主要角色有:
- Context 环境类:它是使用算法的角色,它在解决某个问题时可以采用多种策略,它维护一个对Strategy对象的引用,并根据具体情况选择合适的策略对象来执行算法。
- Strategy 抽象策略类:它是一个抽象接口,用于定义所有支持的算法的公共接口,Context使用这个接口来调用具体策略定义的算法。
- ConcreteStrategy 具体策略类:它是抽象策略类的子类,实现了具体的算法或行为。
策略模式的优点有:
- 符合开闭原则,可以在不修改原有系统的基础上选择或增加新的算法。
- 避免使用多重条件语句,如if…else或switch…case,提高代码可读性和可维护性。
- 可以提供相同行为的不同实现,增加了程序的灵活性。
- 可以实现算法和客户端之间的解耦,客户端只需要知道策略接口,而不需要知道具体实现。
策略模式的缺点有:
- 策略模式会造成很多的策略类,增加了系统的复杂度。
- 客户端必须知道所有的策略类,并自己选择一个合适的对象。
- 所有策略类都需要对外暴露。
策略模式适用于以下场景:
- 一个系统有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重条件选择语句来实现。
想的时候,要想想以后会不会需要扩展这个功能
当看到if else...的时候应该想想需不需要这个策略模式
还能省空间如果有很多if else 说不定很多else if会浪费空间