设计模式–策略模式
思路
提前封装好的不同的策略,每次都根据不同的用途使用不同的策略。
优点
1.解耦状态和行为:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。算法可以独立地变化,而不影响使用算法的代码。
2.增强可维护性和可扩展性:策略类的独立性,开发人员可以更加专注于单个算法的实现和优化,而不必担心对其他部分的代码产生影响。
3.提高代码的复用性:多个不同的上下文对象可以共享同一个策略类,从而提高了代码的复用性。
设计
这是一个计算器的设计,它拥有不同的策略,目前有加法和减法,用户在点击相应按钮会触发不同的策略。
#include <iostream>
// 策略抽象类
class Operation {
public:
virtual int doOperation(int num1, int num2) = 0;
};
// 加法策略
class Addition : public Operation {
public:
int doOperation(int num1, int num2) override {
return num1 + num2;
}
};
// 减法策略
class Subtraction : public Operation {
public:
int doOperation(int num1, int num2) override {
return num1 - num2;
}
};
// 上下文类
class Calculator {
private:
Operation* operation;
public:
Calculator(Operation* op) : operation(op) {}
int calculate(int num1, int num2) {
return operation->doOperation(num1, num2);
}
};
int main() {
Addition addition;
Calculator calculator(&addition);
std::cout << "加法结果:" << calculator.calculate(10, 5) << std::endl;
Subtraction subtraction;
calculator = Calculator(&subtraction);
std::cout << "减法结果:" << calculator.calculate(10, 5) << std::endl;
return 0;
}
与状态模式不同,状态模式有一个具体的设备对象,在使用的时候修改的只是它的状态,不需要看内容的代码,直接使用不同函数即可;而策略模式有一个上下文对象,根据传入的不同策略对象进行执行。
每次使用在使用上下文对象的时候都要传入一个策略对象,这个策略对象是抽象策略类的子类,然后再上下文对象里面用抽象策略对象指针接收这个策略对象即可实现多态,然后调用父类的函数就会执行子类的函数。
如果想添加乘法或者除法的话,只需要实现相应的策略类即可,无需修改其他代码。