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

行为模式---策略模式

概念

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

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

适用场景

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

相关文章:

  • C++多线程编程 3.互斥量、互斥锁
  • 百某田网任务脚本
  • c语言经典案例题
  • Insar结合ISCE2,某一个文件进行并行-stackSentinel.py
  • 【Maven教程与实战案例】
  • 霍夫变换法是基于传统视觉特征的道路车道线检测算法中的一种经典方法
  • 【反无人机目标检测】DRBD-YOLOv8
  • 解决用拼音录入汉字时导致的应用退出floating point invalid operation at 0x6b873ec3
  • 【使用 Python 结合 ADB 监控进程状态】
  • C# JObject 快速定位节点值
  • 洞悉C++内存结构:解锁深层优化潜力
  • go个人论坛项目
  • 邮箱验证:外贸邮件营销中的关键策略
  • Future<V>接口 和 CompletableFuture<T>类 介绍
  • Ubuntu conda虚拟环境不同设备之间迁移
  • 环境配置 | [特殊字符] 5分钟极简Git入门:从零上手版本控制
  • Goby 漏洞安全通告| Apache Tomcat 远程命令执行(CVE-2025-24813)
  • LabVIEW cRIO中CSV文件的读取
  • iOS底层原理系列01-iOS系统架构概览-从硬件到应用层
  • 文献分享: Aligner——学习稀疏对齐的检索模型
  • 解放日报:“感觉全世界人都在上海买买买”
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 国际金价下跌,中概股多数上涨,穆迪下调美国主权信用评级
  • 国寿资产获批参与第三批保险资金长期投资改革试点
  • 自然资源部:不动产登记累计化解遗留问题房屋2000多万套
  • 为什么越来越多景区,把C位留给了书店?