c++设计模式之策略模式

  1. 策略模式(Strategy Pattern)
    定义
    策略模式定义了一系列算法(或操作),并将每个算法封装在一个类中,使它们可以互换。策略模式的核心思想是将选择算法的责任从使用算法的类中分离出来,从而使得算法可以独立变化。

应用场景
当系统需要根据不同的条件选择不同的算法或行为时,策略模式是一个理想的解决方案。
例如,监控软件在与不同型号的交换机交互时,可能需要根据交换机的配置策略、管理需求等选择不同的操作策略。
结构
Context(上下文):使用策略的对象,持有一个对策略的引用,并委托任务给具体的策略对象。
Strategy(策略接口):定义一个接口,所有的具体策略类都实现该接口。
ConcreteStrategy(具体策略类):实现具体的算法或操作。
代码示例
假设我们需要根据不同的网络环境选择不同的连接策略(例如,基于串口、SSH或Telnet连接设备)。

2.1 定义策略接口

cpp
// ConnectionStrategy.h
#ifndef CONNECTION_STRATEGY_H
#define CONNECTION_STRATEGY_Hclass ConnectionStrategy {
public:virtual void connect() = 0;virtual ~ConnectionStrategy() {}
};#endif // CONNECTION_STRATEGY_H2.2 定义具体策略类
cpp
// SerialConnection.h
#ifndef SERIAL_CONNECTION_H
#define SERIAL_CONNECTION_H#include "ConnectionStrategy.h"
#include <iostream>class SerialConnection : public ConnectionStrategy {
public:void connect() override {std::cout << "Connecting via Serial Port..." << std::endl;}
};#endif // SERIAL_CONNECTION_H
cpp
// SSHConnection.h
#ifndef SSH_CONNECTION_H
#define SSH_CONNECTION_H#include "ConnectionStrategy.h"
#include <iostream>class SSHConnection : public ConnectionStrategy {
public:void connect() override {std::cout << "Connecting via SSH..." << std::endl;}
};#endif // SSH_CONNECTION_H
2.3 定义上下文类
cpp
// NetworkManager.h
#ifndef NETWORK_MANAGER_H
#define NETWORK_MANAGER_H#include "ConnectionStrategy.h"class NetworkManager {
private:ConnectionStrategy* connectionStrategy;public:NetworkManager(ConnectionStrategy* strategy) : connectionStrategy(strategy) {}void setConnectionStrategy(ConnectionStrategy* strategy) {connectionStrategy = strategy;}void connect() {connectionStrategy->connect();}
};#endif // NETWORK_MANAGER_H
2.4 使用策略
cpp
// Main.cpp
#include "NetworkManager.h"
#include "SerialConnection.h"
#include "SSHConnection.h"int main() {ConnectionStrategy* serial = new SerialConnection();ConnectionStrategy* ssh = new SSHConnection();NetworkManager manager(serial);manager.connect();  // Output: Connecting via Serial Port...manager.setConnectionStrategy(ssh);manager.connect();  // Output: Connecting via SSH...delete serial;delete ssh;return 0;
}

解释
ConnectionStrategy 定义了连接的接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16955.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

探索AI驱动的企业知识库:提升管理效率的新利器

对于企业而言&#xff0c;如何高效管理知识、提升团队协作、加速决策过程&#xff0c;已成为生存与发展的关键。而人工智能(AI)的迅速发展为解决这些问题提供了新的思路和工具。越来越多的企业开始构建AI驱动的知识库&#xff0c;以实现信息的智能管理与利用。本文将深入探讨AI…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

【Framework系列】UnityEditor调用外部程序详解

需求介绍 之前Framework系列有介绍过导表配置工具&#xff0c;感兴趣的小伙伴可以看一看之前的文章《【Framework系列】Excel转Json&#xff0c;配置表、导表工具介绍》。由于导表工具和Unity是两个工程&#xff0c;导表工具不在Unity工程之内&#xff0c;所以在配置生成完成之…

redis序列化数据查询

可以看到是HashMap&#xff0c;那么是序列化的数据 那么我们来获得反序列化数据 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import redis.clients.jedis.Jedis;public class RedisDeserializeDemo {public static…

ui->tableView升序

亮点 //设置可排序ui->tableView->setSortingEnabled(true);ui->tableView->sortByColumn(0,Qt::AscendingOrder); //排序void Widget::initTable() {//设置焦点策略:ui->tableView->setFocusPolicy(Qt::NoFocus);//显示网格线:ui->tableView->se…

Dubbo源码解析-服务导出(四)

一、服务导出 当我们在某个接口的实现类上加上DubboService后&#xff0c;就表示定义了一个Dubbo服务&#xff0c;应用启动时Dubbo只要扫描到了DubboService&#xff0c;就会解析对应的类&#xff0c;得到服务相关的配置信息&#xff0c;比如&#xff1a; 1. 服务的类型&…

NPOI 实现Excel模板导出

记录一下使用NPOI实现定制的Excel导出模板&#xff0c;已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…

CVSS4与CVSS3的不同

CVSS最近出版了新的版本CVSS4.0&#xff0c;新的版本与3.1版本有什么不同吗&#xff1f; 它会带来哪些影响&#xff1f;本片文章主要目的是介绍3.1与4.0版本之间有什么不同&#xff0c;以及会带来什么变化。 再进入比较之前&#xff0c;先简单介绍一下什么是CVSS。 CVSS&…

【返璞归真】-标准化

在第一个维度数值很大、第二个维度数值很小的情况下&#xff0c;为了让聚类和回归等统计方法更有效地处理数据&#xff0c;需要对数据进行预处理&#xff0c;主要考虑以下几方面&#xff1a; 1. 数据标准化或归一化 由于两个维度的数值量级差异很大&#xff0c;直接使用这些数…

linux文件切割

切割&#xff0c;每个文件切割3.5G split -b 3358m file.tar.gz yourfile_part_ 合并 cat yourfile_part_* > test.tar.gz 比对md5sum值&#xff0c;一致

超详细:索引介绍(易懂!)

索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字&#xff0c;速度很慢。如果…

智能化护士排班系统的设计与实现(文末附源码)

自动排班-护士(分白班|夜班) 当服务器启动时检测需要自动排班,自动开始排班的算法执行 获得本周的所有日期,例如2023-01-29.....2023-02-04依次对每个科室&#xff0c;从第一天开始,逐天进行排班&#xff0c;分别设置两个二个数组&#xff0c;day[7];night[7]分别记忆一周内每…

C语言指针初步(1)

本期重点&#xff1a;指针的性质、本质和作用 指针是C语言变量的一种&#xff0c;总的来说&#xff0c;它和int或者char之类的变量类型没有什么显著的区别&#xff0c;唯一的重点在于&#xff0c;指针实际上是地址。可以说指针就是地址&#xff0c;它是一个专门用于存放地址的变…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

【开源项目】数字孪生仓储~经典开源项目数字孪生智慧仓储——开源工程及源码

飞渡科技数字孪生仓储管理平台&#xff0c;基于国产数字孪生引擎平台&#xff0c;整合WMS系统&#xff0c;深度融合5G、大数据、云计算、AI、融合通信等前沿技术应用&#xff0c;将数据、技术、设备与仓储管理需求有机结合&#xff0c;构建多维立体可视窗口&#xff0c;实现仓库…

unity3d————Resources异步加载

知识点一&#xff1a;Resources异步加载是什么&#xff1f; 在Unity中&#xff0c;资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行&#xff0c;如果加载的资源过大&#xff0c;可能会导致程序卡顿&#xff0c;因为从硬盘读取数据到内存并进行处理…

计算机毕业设计Python+CNN卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

这个 AI 懂 Vue 吗?

作者&#xff1a;前端俱乐部 写在前面 最近海外的 AI 编辑器 Cursor 好像挺火的&#xff0c;与此同时&#xff0c;字节跳动也推出了豆包MarsCode编程助手&#xff0c;可以直接生成代码和极限编程。 豆包MarsCode AI 支持网页版编辑器&#xff0c;但我个人更喜欢让它和人气爆棚…