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

2.策略模式

UML图

在这里插入图片描述

代码

main.cpp

#include "Strategy.h"
#include "Context.h"void test()
{Context* pContext = nullptr;/* StrategyA */pContext = new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext = new Context(new StrategyB());pContext->contextInterface();/* StrategyC */pContext = new Context(new StrategyC());pContext->contextInterface();delete pContext;pContext = nullptr;
}int main()
{test();system("pause");
}

Strategy.h

#pragma once
#include <iostream>
using namespace std;/*
策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
*//* 抽象策略基类:定义所有支持算法的公共接口 */
class Strategy
{
public:virtual void algorithmInterface() = 0;
};/* 策略A */
class StrategyA :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法A实现" << endl;}
};/* 策略B */
class StrategyB :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法B实现" << endl;}
};/* 策略C */
class StrategyC :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法C实现" << endl;}
};

Context.h

#pragma once
#include "Strategy.h"/*
笔者感受:使用类C操控类A继承体系A1,A2,A3中公有对外暴露接口。
利用一个额外的类,(1)将strategy抽象策略基类,作为额外类的入参;
(2)将strategy抽象策略基类作为额外类的成员变量,利用多态原理,接收外面传来的具体抽象策略。
(3)对外暴露的接口中,使用成员变量抽象策略基类,调用策略继承体系中的子类们都需要继承的纯虚函数接口。
即可,使用额外类操控策略继承体系中公有对外暴露的接口了。
*/
class Context
{
public:Context(Strategy* pStrategy) :m_pStrategy(pStrategy) {}void contextInterface();
private:Strategy* m_pStrategy{ nullptr };
};void Context::contextInterface()
{m_pStrategy->algorithmInterface();
}

策略模式+简单工厂

  • 优点:策略模式+简单工厂:可以完全将策略继承体系与用户端完全剥离开来,将策略继承体系完全封装起来,对用户完全不可见。
  • 总结
    • 类C通过没什么信息含量的枚举作为入参,利用简单工厂生成类A继承体系中的各子类A1、A2、A3。同时,用基类A作为类C的成员变量,接一下刚生成的类A的子类。
    • 类C对外统一暴露一个接口,该接口中,类C的成员变量类A调用继承体系公有对外暴露的接口func()。

main.cpp

#include "StrategyFactory.h"/*
策略方法+简单工厂:可以将策略继承体系完全剥离开来,完全封装起来,对用户完全不可见。
*/void test()
{StrategyFactory* pStrategyFactory = nullptr;/* StrategyA */pStrategyFactory = new StrategyFactory(StrategyType::eStrategyA);pStrategyFactory->contextInterface();/* StrategyB */pStrategyFactory = new StrategyFactory(StrategyType::eStrategyB);pStrategyFactory->contextInterface();/* StrategyC */pStrategyFactory = new StrategyFactory(StrategyType::eStrategyC);pStrategyFactory->contextInterface();delete pStrategyFactory;pStrategyFactory = nullptr;
}int main()
{test();system("pause");
}

Strategy.h

#pragma once
#include <iostream>
using namespace std;/*
策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
*//* 抽象策略基类:定义所有支持算法的公共接口 */
class Strategy
{
public:virtual void algorithmInterface() = 0;
};/* 策略A */
class StrategyA :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法A实现" << endl;}
};/* 策略B */
class StrategyB :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法B实现" << endl;}
};/* 策略C */
class StrategyC :public Strategy
{
public:virtual void algorithmInterface()override{cout << "算法C实现" << endl;}
};

StrategyFactory.h

#pragma once
#include "Strategy.h"/*
我的感受:使用类C操控类A继承体系A1,A2,A3中公有对外暴露接口。
利用一个额外的类,(1)将strategy抽象策略基类,作为额外类的入参;
(2)将strategy抽象策略基类作为额外类的成员变量,利用多态原理,接收外面传来的具体抽象策略。
(3)对外暴露的接口中,使用成员变量抽象策略基类,调用策略继承体系中的子类们都需要继承的纯虚函数接口。
即可,使用额外类操控策略继承体系中公有对外暴露的接口了。
*/
enum StrategyType
{eStrategyA,eStrategyB,eStrategyC
};class StrategyFactory
{
public:StrategyFactory(StrategyType nType);~StrategyFactory();void contextInterface();
private:Strategy* m_pStrategy{ nullptr };
};StrategyFactory::StrategyFactory(StrategyType nType)
{switch (nType){case eStrategyA:m_pStrategy = new StrategyA();break;case eStrategyB:m_pStrategy = new StrategyB();break;case eStrategyC:m_pStrategy = new StrategyC();break;}
}StrategyFactory::~StrategyFactory()
{delete m_pStrategy;m_pStrategy = nullptr;
}void StrategyFactory::contextInterface()
{m_pStrategy->algorithmInterface();
}

相关文章:

2.策略模式

UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…...

算法通过村第七关-树(递归/二叉树遍历)黄金笔记|迭代遍历

文章目录 前言1. 迭代法实现前序遍历2. 迭代法实现中序遍历3. 迭代法实现后序遍历总结 前言 提示&#xff1a;在一个信息爆炸却多半无用的世界&#xff0c;清晰的见解就成了一种力量。 --尤瓦尔赫拉利《今日简史》 你是不是觉得上一关特别简单&#xff0c;代码少&#xff0c;背…...

MySQL数据库简介+库表管理操作+数据库用户管理

Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据&#xff08;Data&#xff09;1.2.2 表1.2.3 数据库1.2.4 数据库管理系统&#xff08;DBMS&#xff09;1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…...

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道&#xff0c;二维卷积运算示例 单通道&#xff0c;二维&#xff0c;带偏置的卷积示例 带填充的单通道&#xff0c;二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…...

MapRdeuce工作原理

hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map&#xff1a; Reduce...

完整指南:使用JavaScript从零开始构建中国象棋游戏

引言 中国象棋&#xff0c;又被称为国际象棋&#xff0c;是一款起源于中国的古老棋类游戏。本文旨在为大家提供一个简单明了的步骤&#xff0c;教你如何使用JavaScript从零开始构建这款经典的棋类游戏。 1. 游戏简介 在中国象棋中&#xff0c;两方各有一军队&#xff0c;包括…...

PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni

一、风哥PG-DBA培训19&#xff1a;PostgreSQL高可用集群项目实战之Patroni 课程目标&#xff1a; 本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni&#xff0c;学完本课…...

数据库管理-第105期 安装Database Valut组件(20230919)

数据库管理-第105期 安装Database Valut组件&#xff08;20230919&#xff09; 之前无论是是EXPDP还是PDB中遇到的一些问题&#xff0c;其实都跟数据库的DV&#xff08;Database Valut&#xff09;组件有关&#xff0c;因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …...

企望制造ERP系统RCE漏洞 复现

文章目录 企望制造ERP系统RCE漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 企望制造ERP系统RCE漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…...

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用

文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql&#xff08;扩展&#xff09;完结 前言 游戏存档不言而喻&#xff0c;是游戏设计中的重要元素&#xff0c;可以提高游戏的可玩性&#xff0c;为玩家提供更多的自由和…...

2023-9-22 滑雪

题目链接&#xff1a;滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…...

基于Yolov8的工业小目标缺陷检测(6):多检测头结合小缺陷到大缺陷一网打尽的轻量级目标检测器GiraffeDet,暴力提升工业小目标缺陷检测能力

💡💡💡本文改进:多头检测器结合大小缺陷一网打尽的GiraffeDet,进一步提升处理低分辨率图像和小物体等更困难的检测能力。 多头检测器+ GiraffeDet | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.734 收录专栏: 💡💡💡深度学习工业缺陷检测 :h…...

exe文件运行后无输出直接闪退如何找解决办法

一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息&#xff0c;直接用搜索引擎搜索这个异常代码能大致判断是什么问题&#xff0c;给了一个解决思路&#xff0c;不至于不知道到底哪里出了问题...

OpenHarmony应用开发—ArkUI组件集合

介绍 本示例为ArkUI中组件、通用、动画、全局方法的集合。 效果预览 使用说明&#xff1a; 1.点击组件、通用、动画、全局方法四个按钮或左右滑动切换不同视图。 2.点击二级导航&#xff08;如通用属性、通用事件等&#xff09;&#xff0c;若存在三级导航则展开三级导航&#…...

Linux(CentOS)安装msf

目录 一、安装MSF 1.1 在线安装 1.2 离线安装 二、安装Postgresql数据库 一、安装MSF 1.1 在线安装 需要挂梯子&#xff01;挂完梯子需要reboot重启&#xff0c;多试几次就可以&#xff0c;国内网络我试了很久都不行。没条件没梯子的看1.2离线安装 cd /opt curl https://ra…...

工作几年还是悟不懂自动化测试的意义

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 有人问&#xff1a;自动化测试的成本高效果差&#xff0c;那么自动化测试的意义在哪呢&#xff1f; 我…...

Redis面试问题三什么是缓存雪崩怎么解决

定义 缓存雪崩是因为大量的key设置了同一过期时间的导致在同一时间类缓存同时过期&#xff0c;而这时因为请求过来已经没有缓存了&#xff0c;DB压力大数据库崩溃了。 解决方法 我可以在设置过期时间的时候加一个随机时间&#xff0c;在1-5分钟那样可以分散过期时间&#xf…...

【Unittest】自动化测试框架核心要素

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 1、什么是Unittest框架&#xff1f; python自带一种单元测试框架 2、为什么使用UnitTest框架&#xff1…...

Hyperloglog

一&#xff0c;前言 在互联网行业中存在两个比较重要的指标&#xff1a;PV&#xff08;页面访问量&#xff09;和 UV&#xff08;用户访问量&#xff09; 如果有这样的一个业务&#xff1a; 统计PV&#xff0c;那么你会怎么做&#xff1f; 我们可以使用Redis的incr、incrby指…...

如何自动获取短信验证码?

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题&#xff0c;进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…...

Matlab 实现 DES 与 RSA 双重加密及可视化界面搭建

基于matlab上的DES和RSA两种算法的双重加密&#xff0c;附带显示界面&#xff0c;可更改DES密钥&#xff0c;明文消息&#xff08;在显示界面中&#xff09;&#xff0c;可在代码中更改RSA对应的p&#xff0c;q&#xff0c;e等数据&#xff0c;代码可附加注释和对应要求修改。在…...

OpenCV实战:用Python+SIFT+八点算法搞定双目视觉匹配(附完整代码)

OpenCV实战&#xff1a;PythonSIFT八点算法实现双目视觉精准匹配 在计算机视觉领域&#xff0c;立体匹配是一个经典而富有挑战性的问题。想象一下&#xff0c;当你用双眼观察世界时&#xff0c;大脑能自动计算出物体的距离——这正是双目视觉系统要模拟的过程。本文将带你用Pyt…...

GTE文本向量助力智能写作:文本分类与情感倾向双重把关

GTE文本向量助力智能写作&#xff1a;文本分类与情感倾向双重把关 1. 智能写作的核心挑战&#xff1a;内容质量的多维评估 在内容创作领域&#xff0c;我们常常面临一个基本矛盾&#xff1a;如何同时保证文本的专业性和情感表达&#xff1f;传统写作辅助工具往往只能解决单一…...

告别网络依赖:用这个开源工具+高德离线包,5步搞定前端地图离线展示

前端开发者的离线地图解决方案&#xff1a;5步实现高德地图本地化部署 在紧急演示、内网开发或网络不稳定的环境中&#xff0c;依赖在线地图服务往往成为前端开发的痛点。我曾参与过一个政府内网项目&#xff0c;现场演示时因网络权限问题导致地图无法加载&#xff0c;最后不得…...

7天打造智能助理:OpenClaw+Qwen3-VL:30B飞书开发周计划

7天打造智能助理&#xff1a;OpenClawQwen3-VL:30B飞书开发周计划 1. 为什么选择这个组合&#xff1f; 去年冬天&#xff0c;我偶然在GitHub上发现了OpenClaw这个项目。当时我正在为团队寻找一个既能处理日常办公自动化&#xff0c;又能理解图片内容的智能助手方案。传统的RP…...

OpenClaw常用命令与在Windows下安装Tavily-Search

目录1. Windows安装Tavily-Search2. 启动与关闭2.1 正常流程2.2 故障处理3. 模型切换1. Windows安装Tavily-Search 确保目录位于C:\Users\用户名运行命令npx clawhub install openclaw-tavily-search在C:\Users\用户名\.openclaw创建文件.env用记事本打开.env&#xff0c;写入…...

本地Cookie导出终极指南:Get cookies.txt LOCALLY 安全使用教程

本地Cookie导出终极指南&#xff1a;Get cookies.txt LOCALLY 安全使用教程 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 你是否曾担心浏览器Coo…...

告别硬编码!用BAdI LE_SHP_TAB_CUST_ITEM给VL01N交货单加个自定义标签页(附完整代码)

告别硬编码&#xff01;用BAdI LE_SHP_TAB_CUST_ITEM实现交货单标签页优雅增强 在SAP SD模块的日常开发中&#xff0c;为外向交货单添加客户化信息是再常见不过的需求。但很多开发者习惯直接在标准程序里插入硬编码&#xff0c;这种看似快捷的方式往往会给后续维护埋下隐患。今…...

Mojo项目无法import本地.py模块?工程师连夜修复的6种路径/环境变量/Loader级配置错误

第一章&#xff1a;Mojo项目无法import本地.py模块的根本原因剖析Mojo 语言虽兼容 Python 语法&#xff0c;但其运行时环境与 CPython 截然不同——它基于 LLVM 编译为原生机器码&#xff0c;并通过 Mojo Runtime 执行&#xff0c;**不依赖 Python 解释器进程**。因此&#xff…...

基于主从博弈的主动配电网阻塞管理探索

基于主从博弈的主动配电网阻塞管理 首先&#xff0c;在日前市场中&#xff0c;LA&#xff08;负荷聚合商&#xff09;根据历史数据预测次日向上级电网购电的电价信息和预测分布式电源(燃气轮机)出力、风电场出力信息&#xff0c;同时考虑事前与用户签订协议的可中断负荷&#x…...