当前位置: 首页 > 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…...

新手父母必备:开源婴儿护理知识库架构与核心技能解析

1. 项目概述&#xff1a;一个为新手父母量身定制的技能宝库如果你是一位即将迎来新生命&#xff0c;或者刚刚升级为父母的朋友&#xff0c;面对那个软软糯糯的小家伙&#xff0c;除了满心的喜悦&#xff0c;是不是也时常感到一丝手足无措&#xff1f;喂奶、拍嗝、哄睡、洗澡、抚…...

数据中心网络跃迁:25GbE以太网如何以创造性破坏重塑技术路径

1. 从技术演进到范式跃迁&#xff1a;我眼中的“创造性破坏”风暴我是在上世纪90年代末来到这里的&#xff0c;那是一个技术浪潮奔涌的年代。我亲眼见证了录像带从VHS到DVD&#xff0c;再到如今的云DVR和视频流媒体的完整迭代&#xff1b;也目睹了通信设备从固定电话到功能手机…...

Windows Defender 彻底移除工具:专业级系统安全组件管理解决方案

Windows Defender 彻底移除工具&#xff1a;专业级系统安全组件管理解决方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_m…...

告别Excel!用CANalyzer系统变量做CAN信号实时运算,保姆级配置流程(附CAPL脚本)

告别Excel&#xff01;用CANalyzer系统变量实现CAN信号实时运算的工程实践 在车辆网络数据分析领域&#xff0c;工程师们经常需要验证不同CAN信号之间的理论关系&#xff0c;比如车速与轮速的比例校验、扭矩与电流的线性相关性分析。传统做法是将CANoe/CANalyzer采集的数据导出…...

ShareGPT4Omni/ShareGPT4Video:构建可分享的AI对话知识库实战指南

1. 项目概述&#xff1a;当AI多模态模型遇上“分享”的刚需 最近在AI圈子里&#xff0c;一个现象级的开源项目“ShareGPT4Omni/ShareGPT4Video”引起了我的注意。乍一看标题&#xff0c;你可能以为这又是一个基于GPT-4的对话应用&#xff0c;但它的核心价值远不止于此。简单来说…...

跨平台光标同步工具:技术原理、实现与多屏开发效率优化

1. 项目概述&#xff1a;一个为开发者量身定制的光标同步工具 如果你和我一样&#xff0c;经常需要在多台显示器、多个IDE窗口&#xff0c;甚至是远程桌面和本地环境之间来回切换&#xff0c;那么你一定对“找光标”这件事深恶痛绝。尤其是在进行代码对比、调试或者多屏幕协作时…...

终极指南:如何在Windows上轻松模拟游戏控制器 - ViGEmBus驱动完整教程

终极指南&#xff1a;如何在Windows上轻松模拟游戏控制器 - ViGEmBus驱动完整教程 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困…...

把边界立起来,理解 ABAP Cloud 的几根主梁

项目里最让人头疼的时刻,往往不是写代码那天,而是系统升级后的那个早晨。很多团队都有过类似体验,业务明明没有改,几个增强点、几段直连标准表的逻辑、几次对未发布对象的调用,却在升级后一起冒烟。表面上看,这是兼容性问题,往深处看,其实是开发边界没有真正立起来。AB…...

企业如何通过Taotoken实现API密钥的统一管理与审计

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业如何通过Taotoken实现API密钥的统一管理与审计 在将大模型能力集成到企业业务流程的过程中&#xff0c;一个常见的挑战是如何安…...

KMS智能激活终极指南:5分钟永久激活Windows和Office全系列

KMS智能激活终极指南&#xff1a;5分钟永久激活Windows和Office全系列 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文档突然变…...