当前位置: 首页 > article >正文

行为模式---策略模式

概念

策略模式是一种行为设计摸是,它的核心思想是将一些列的算法封装成独立的对象,并使它们可以相互替换,通过上下文进行调用。

策略模式通过算法抽象为独立的策略类,客户端可以根据自身需求选择不同的策略类来完成任务、这种方式使得算法的变化不会影响客户端代码。

适用场景

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

http://www.kler.cn/a/583187.html

相关文章:

  • 【Java进阶学习 第七篇】窗体与监听
  • 【数据挖掘】通过心脏病数据案例熟悉数据挖掘的完整过程
  • Python数据分析之数据可视化
  • WorkTool 技术解析:企业微信自动化办公的合规实现方案
  • Flow-matching论文阅读
  • Leetcode 909: 蛇梯棋(Snakes and Ladders)
  • 【项目】负载均衡式在线OJ
  • 5G工业路由器赋能无人码头,港口物流智能化管理
  • Towards Universal Fake Image Detectors that Generalize Across Generative Models
  • 【Spring 事件机制】
  • 《云原生监控体系构建实录:从Prometheus到Grafana的观测革命》
  • java如何在linux服务器创建文件excel并把循环插入每一行的后端查出来的数据,每天新建一个excel带时间的
  • MySQL数据库的相关语句
  • 船舶制造内检革新 内检实验室LIMS系统如何破局行业痛点
  • Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境
  • git 撤销某次提交的上交到远程服务器的commit提交,此提交后面的commit需要保留【deeepseek生成】
  • 【每日学点HarmonyOS Next知识】顶部状态栏、文本最大行数后缀、弹窗背景、状态栏颜色、导航
  • 【零基础入门unity游戏开发——进阶篇】Unity Microphone类处理麦克风相关信息,录制音频并实时处理或保存录制的音频数据
  • 鸿蒙ArkTs如何实现v-html的功能,显示富文本内容?
  • c#面试题12