行为模式---策略模式
概念
策略模式是一种行为设计摸是,它的核心思想是将一些列的算法封装成独立的对象,并使它们可以相互替换,通过上下文进行调用。
策略模式通过算法抽象为独立的策略类,客户端可以根据自身需求选择不同的策略类来完成任务、这种方式使得算法的变化不会影响客户端代码。
适用场景
1、当使用对象使用一系列不同的算法,并在运行的时候需要进行动态切换,可以使用策略模式。
2、当有许多的仅在执行的时候一些行为不同,但是这些行为却有些类似的时候就可以使用策略模式。
3、隔离算法和业务逻辑,如果算法的逻辑在上下文中不是很重要,那么就可以使用策略模式将算法封装,实现算法和业务逻辑的隔离。
4、当使用了一系列同一算法的不同变体的时候,需要复杂的条件判断来执行对应的算法的时候,可以使用策略模式。减少业务逻辑的复杂度。
创建方式
1、策略模式需要创建立两个接口,一个是算法接口类,一个是上下文接口。
2、创建算法接口类,需要定义一个算法函数。
3、创建一个上下文接口,需要实现一个算法的引用对象,和一个是设置算法对象的函数,算法执行函数。
4、实现具体的事算法类,继承算法接口类,实现具体的算法实现。
5、实现具体的上下类,继承上下接口。实现接口中的函数。在实现定调用的函数的时候通过算法对象的引用调用算法函数。
6、在客户端使用的时候,先创建算法对象,之后创建上下文对象,在创建上下文对象的时候可以通过构造函数或者设置算法对象的函数将算法对象设置给上下文对象。之后调用上下文函数即可。
类关系图
示例代码
#include "CeLueMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
//创建策略类对象
AlgorithmBase* add = new AddAlgorithm();
AlgorithmBase* sub = new SubAlgorithm();
AlgorithmBase* mul = new MulAlgorithm();
//创建上下文类
CeContext context;
context.setAlgorith(add);
int ret = context.callAlgorithm(5, 5);
cout << "add : ret = " << ret << endl;
context.setAlgorith(sub);
ret = context.callAlgorithm(5, 5);
cout << "sub : ret = " << ret << endl;
context.setAlgorith(mul);
ret = context.callAlgorithm(5, 5);
cout << "mul : ret = " << ret << endl;
}
#pragma once
//算法接口类
class AlgorithmBase
{
public:
AlgorithmBase() {}
~AlgorithmBase() {}
virtual int algorithm(int a, int b) { return 0; }
};
//具体算法类 +
class AddAlgorithm : public AlgorithmBase {
public:
AddAlgorithm() {}
~AddAlgorithm() {}
int algorithm(int a, int b) {
return a + b;
}
};
//具体算法类 -
class SubAlgorithm : public AlgorithmBase {
public:
SubAlgorithm() {}
~SubAlgorithm() {}
int algorithm(int a, int b) {
return a - b;
}
};
//具体算法类 *
class MulAlgorithm : public AlgorithmBase {
public:
MulAlgorithm() {}
~MulAlgorithm() {}
int algorithm(int a, int b) {
return a * b;
}
};
//上下文类,此处省略接口类
class CeContext {
public:
CeContext() {}
~CeContext() {}
void setAlgorith(AlgorithmBase* alg) {
m_alg = alg;
}
int callAlgorithm(int a,int b) {
int ret = 0;
if (m_alg) {
ret = m_alg->algorithm(a, b);
}
return ret;
}
private:
AlgorithmBase* m_alg = nullptr;
};
欢迎东哥来到设计模式的世界!
add : ret = 10
sub : ret = 0
mul : ret = 25