Strategy:策略模式

2023-10-31

      需要令某个模块(上下文)执行一个功能,但是该模块可以配置不同的算法,在不同的算法下,执行的结果也不同。

      这里,算法就是策略。策略模式就是在运行时可以进行策略的更改,从而影响到执行的结果。

 

1.    定义策略类基类及派生类

策略类基类定义了策略类的标准接口。

策略类派生类实现了策略类的标准接口。

策略类提供的标准接口一般是某个与Context无关的独立功能模块,比如算法。

虽然用户会与策略类进行交互(创建策略类对象),但是用户不会调用策略类的标准接口。

//策略类基类
class Strategy
{
public:
	virtual void algrithmInterface() = 0;
protected:
	Strategy();
private:
};

//策略类派生类
class ConcreteStrategyA : public Strategy
{
public:
	virtual void algrithmInterface()
	{
		cout << "ConcreteStrategyA::algrithmInterface" << endl;
	};
};

//策略类派生类
class ConcreteStrategyB : public Strategy
{
public:
	virtual void algrithmInterface()
	{
		cout << "ConcreteStrategyB::algrithmInterface" << endl;
	};
};

2.    定义上下文

上下文类为用户提供了一个标准的执行函数接口,该接口是由用户调用的。

上下文类内嵌了策略类对象,并会在执行函数中对策略类的标准接口进行调用。

//上下文
class Context
{
public:
	Context(Strategy* strategy)
	{
		this->_strategy = strategy;
	};
	void setStrategy(Strategy* strategy)
	{
		this->_strategy = strategy;
	}
	void doAction()
	{
		this->_strategy->algrithmInterface();
	};
private:
	Strategy* _strategy;
};

3.    用户使用

用户与上下文对象进行交互。用户所需要的功能实现都是通过调用上下文对象的标准接口来实现的。

但是用户也必须决定使用哪种策略,并将策略配置给上下文对象。

void main()
{
	//策略A与B可替换
	Strategy* pStrategyA = new ConcreteStrategyA();
	Context* pContext = new Context(pStrategyA);
	pContext->doAction();

	Strategy* pStrategyB = new ConcreteStrategyB();
	pContext->setStrategy(pStrategyB);
	pContext->doAction();
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Strategy:策略模式 的相关文章

  • “RouteCollection”不包含“MapMvcAttributeRoutes”的定义

    我尝试使用基于属性的路由 但是当我尝试以下代码片段来激活基于属性的路由时 我收到以下错误消息 RouteCollection 不包含定义 MapMvcAttributeRoutes 这是我的代码 public class RouteConf
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • 在 C# 中轻松创建支持索引的属性

    在 C 中我发现索引属性 http msdn microsoft com en us library aa288464 VS 71 aspx非常有用 例如 var myObj new MyClass myObj 42 hello Conso
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • std::tr1::function 和 std::tr1::bind

    我在使用时遇到问题veryC 类中的复杂 C 函数 重写 C 函数是not一个选项 C函数 typedef void integrand unsigned ndim const double x void fdata unsigned fd
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 函数指针上的未知类型 F TYPE

    include
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 如何在 Visual Studio 2010 Express 中引用 system.drawing?

    我对此有点陌生 我的印象是要绘制我创建的矩形 我需要使用 system drawing graphics 问题是 我收到错误 命名空间 System 中不存在类型或命名空间名称 drawing 您是否缺少程序集引用 当我右键单击解决方案资源
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 将多个 Blob 输入传递到 QueueTrigger Azure 函数的最佳方法

    问题 触发后 生成 3 个 XML 文件 完成后将它们通过 ftp 传输到站点 目前的方法 我有一个 HTTP 触发器 Azure 函数 运行时将构造 3 个 XML 文件并将它们保存到 Azure 存储 Blob 容器中 由于有多个输出
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选

随机推荐

  • 区块链应用_法务存证,电子存证

    电子存证1 0 传统的第三方电子存证平台 国内首例电子合同案件获裁决认可 国内首创电子合同平台 引入第三方保险 发生网贷纠纷 电子合同可以作为法庭证据吗 法官说 周丽婷 电子存证在著作权侵权诉讼中的审查认定 凭什么认可电子存证法律效力 这个
  • Bottle UiKit Python实现的前后端交互代码实现

    文章目录 项目所在 GitHub 地址 1 项目整体思路 2 项目实现技术 3 前端界面实现 4 后端服务器框架 bottle 简单介绍 5 python 代码实现 5 1 main py 5 2 Callibration py 6 前后端
  • 单表多表数据查询(笛卡尔积、内连接、外连接)各种函数

    目录 数学函数 时间函数 三元运算符 聚合函数 通配符与like配合使用
  • js 浮点数与整数比大小

    JS在比较数字的时候一定不要直接比较 而是要转换 因为JS里面的是var 这种是弱的类型 默认是string 所有比较的时候会出现错误 JS里面有两种转换的 parseFloat和parseInt 比较的时候想下面这样 整数如下 if pa
  • 【Loading动画样式】Vue Scss实现的两种Loading动画样式

    动画一
  • ARM64架构下面安装mysql5.6.44全过程

    添加mysql用户组和mysql用户 用于隔离mysql进程 groupadd r mysql useradd r g mysql s sbin nologin M mysql 2 安装依赖库 yum install y libaio 下载
  • python科学计算够用吗_为何选用python进行科学计算

    说明 本篇为翻译文章 原文的题目为 Scientific Computing with Python 从文中可以看出 作者对在科研活动中使用Python有着深刻的见解 而这一点在国内就差许多了 所以 翻译过来放到这里 为Python摇旗呐喊
  • 【论文速览】图像分割领域的通用大模型SegGPT - Segmenting Everything in Context

    文章目录 研究背景 解决思路 Painter SegGPT 实验效果 部分 思考 参考资料 代码地址 https github com baaivision Painter Demo地址 https huggingface co space
  • MyEclipse10.0工程中引入Testng

    1 访问http search maven org search ga 1 a 3A 22testng 22 地址 下载testng最新版本的jar包 2 打开Myeclipse10 0 选中需要引入的工程 右键properties gt
  • PTA 建立学生信息链表

    建立学生信息链表 题目链接 需要权限 本题要求实现一个将输入的学生成绩组织成单向链表的简单函数 函数接口定义 void input 该函数利用scanf从输入中获取学生的信息 并将其组织成单向链表 链表节点结构定义如下 struct stu
  • [翻译] OpenVINO mo_onnx.py

    input model INPUT MODEL w INPUT MODEL m INPUT MODEL Tensorflow a file with a pre trained model binary or text pb file af
  • C# Dictionary(字典) 替换Key(键值)的值方法

    var dict new Dictionary
  • python中文乱码 def execute-python executemany的使用及注意事项

    使用executemany对数据进行批量插入的话 要注意一下事项 coding utf8 conn MySQLdb connect host localhost user root passwd 123456 db myDB cursor
  • 华为存储的多路径说明

    华为存储不需要在OS层面安装多路径软件 而是通过存储本身聚合后映射至服务器使用 如下 root lkrac1 rules d fdisk l Disk dev sda 1099 5 GB 1099511627776 bytes 255 he
  • 利用ArrayList对map进行按key(键)和按value (值) 排序

    利用ArrayList对map进行按key 键 和按value 值 排序 使用比较器 按key 键 排序 通过ArrayList将map entrySet 变成list 然后在类外写具体如何比较大小的方法compare 最后调用 Colle
  • iptables开启日志

    ifconfig eth1 promisc iptables A INPUT j LOG log prefix iptables iptables nvL
  • Ubuntu20.04创建快捷方式(CLion)

    打开命令行 创建在桌面上xxx desktop文件 touch Desktop Clion desktop 编辑desktop文件 Desktop Entry Encoding UTF 8 Name Clion Comment Clion
  • 关于叉积

    学过计算几何以后 我发现几乎每一道题都用到了叉积这个东西 叉积是什么呢 在这个图中 以原点为中心 叉积就是x1 y2 x2 y1 记得话就记1221 x前y后 但是这并不是完全正确 比如说这个图 在这个图中 点1和点2是以点0为中心 不是原
  • C++面试八股文

    4 C 11的新特性 1 auto关键字 在编译时根据初始值自动推导类型 必须初始化 通常作为变量或返回值 2 decltype declare type 用于推导数据类型 用于声明变量 配合auto设置返回值 如下 相较于auto不会计算
  • Strategy:策略模式

    需要令某个模块 上下文 执行一个功能 但是该模块可以配置不同的算法 在不同的算法下 执行的结果也不同 这里 算法就是策略 策略模式就是在运行时可以进行策略的更改 从而影响到执行的结果 1 定义策略类基类及派生类 策略类基类定义了策略类的标准