1.在开发log功能的时候,发现点击发送数据后,没有反应(初始化陷阱)
经检查(很漫长的检查)后发现在最后面加了上次遗留的初始化导致的,相当于初始化两次,
因为加了log功能后需要传入两个实例的构造函数,但是在最后面又重新进入初始化了,但是没有传入参数,导致_logger为null。
后续debug引入一个日志验证
发现一初始化就为null,后续要注意这个
- 先初始化基础服务(如日志器)
- 再初始化依赖它们的服务
2.空对象模式应用
在使用log记录的时候,设计模式特别适合像空日志器这样的"无状态工具对象",它提供了接口实现的灵活性,同时保持了资源使用的最优化
在 NullSerialPortLogger
中使用私有构造函数是为了:
- 强制单例模式:确保全局只有一个实例
- 防止误用:避免开发者创建不必要的实例
- 优化资源:减少内存占用和初始化开销
- 保持一致性:所有使用者共享相同的行为
单例模式在日志系统中的优势:
1.内存效率
// 使用单例:整个应用只有一个实例
var logger1 = NullSerialPortLogger.Instance;
var logger2 = NullSerialPortLogger.Instance;// logger1 == logger2,内存中只有一个对象
2.简化访问
// 任何地方都可以直接访问
public class MyService
{private ISerialPortLogger _logger = NullSerialPortLogger.Instance;// 不需要构造函数注入
}
3.空对象模式
// 作为空对象模式的实现
public class SerialPortService
{public SerialPortService(ISerialPortLogger logger = null){// 如果没有提供日志器,使用空日志器单例_logger = logger ?? NullSerialPortLogger.Instance;}
}
3.构造函数设计原则
- 所有必需依赖都应作为参数
- 使用参数验证确保依赖不为null
- 避免在构造函数中执行复杂逻辑
实现依赖注入
实现定时发送
ISerialPortService 的实现类 SerialPortService 包含定时发送、异常处理等逻辑。通过接口抽象,FrmHelper 可以:
• 调用 SendData 和 StartTimedSend 方法时,无需关心具体实现细节。
• 在需要时替换为其他实现(如带日志或性能监控的版本)。
总结
这种写法的核心目的是 解耦 和 提高扩展性,符合以下设计原则:
- 依赖倒置原则(DIP):依赖抽象(接口),不依赖具体类。
- 开闭原则(OCP):通过扩展而非修改实现功能变化。
- 单一职责原则(SRP):FrmHelper 专注于界面逻辑,不处理串口细节。
github地址:luis1900/SerialPortAssistant-OOP
gittee地址:https://gitee.com/beethoven1900/serial-port-assistant
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916345.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
泊头网站建设公司做网站都需要自己的服务器吗
FL Studio 21是一款强大的数字音频工作站(DAW)软件,为您提供一个完整的软件音乐制作环境。它是制作高质量的音乐、乐器、录音等的完整解决方案。该程序配备了各种工具和插件,帮助你创建专业的虚拟乐器,如贝斯、吉他、钢…
电商设计网站如何制作网站视频教程
web渗透测试漏洞复现 1. ZooKeeper未授权漏洞复现1.1 ZooKeeper简介1.2 ZooKeeper漏洞复现1.3 ZooKeeper漏洞修复建议1. ZooKeeper未授权漏洞复现
1.1 ZooKeeper简介
ZooKeeper 是一个分布式的、开源的协调服务,最初由雅虎开发,现隶属于 Apache 软件基金会,是Google的Chub…
《计算机算法设计与分析》系列--算法实现题1.1-统计数字问题
引言:
这个题在原书的配套习题解答中,描述得比较简略,我不太看得懂,于是按自己的思路做了一遍。
问题描述:
一本书有n页,页码为1,2,.. N,(注意,页码的格式,0不会在最前面)
问在这所有的页码中,0-9这10个数…
银河麒麟系统root密码重置
银河麒麟系统root密码重置
一、系统环境Kylin-Server-V10-SP3-2403-Release-20240426-x86_64二、系统密码重置
1.重启系统重启操作系统,出现如下界面后按e键,进入grub模式。2.默认grub账户密码系统需要输入grub账户密…
银河麒麟系统磁盘管理
银河麒麟系统磁盘管理
一、系统环境Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso二、磁盘管理
1.添加物理磁盘系统识别磁盘,不重启系统重新扫描 SCSI 主机适配器识别到新连接的 SCSI 或 SATA 存储设备
ech…
瑞丽网站建设域名注册局官网
目录
配置开始
Zabbix添加linux主机
4.为agent.zabbix.com添加模板 环境: (隔天做的更换了IP,不影响实际操作) IP 192.168.50.50 关闭防火墙规则 更改主机名 [rootlocalhost ~]# vim /etc/hostname agent.zabbix.com [rootloca…
day 10 (函数2 )
day 10 (函数2 &)课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=183
10.1 函数二学习目标简介------------------------------------------------ 执行后10…
离线部署镜像仓库搭建
离线部署镜像仓库搭建
一、系统准备一台可联网服务器:用于同步仓库(与目标系统同架构)
一台离线内网服务器:最终使用离线内网仓库的机器
存储空间:至少200GB
系统版本:CentOS Linux release 8.5.2111二、在可联网…
Temporal和Airflow有什么差别
Temporal和Airflow有什么差别
Temporal 和 Apache Airflow 是两种主流的工作流编排工具,但它们在设计理念、核心优势和适用场景上有着显著的不同。下面通过一个表格快速梳理它们的核心差异,然后我会进一步解释这些差…
厚街公司网站建设wordpress模板和下载不同
转载一篇问题解决博客:问题解决
一、烧录系统
使用SDK烧录
二、安装archiconda3
JETSON TX2 NX的架构是aarch64,与win10,linxu不同,所以不能安装Anaconda,这里安装对应的archiconda。
1. 安装
wget https://github.com/Archiconda/build-tools/rel…
有前景的长沙企业网站建设开发一套小程序大概多少钱
在C语言中,位段(Bit Fields)是一种用来对结构体中的成员进行位级别的控制的特性。通过位段,我们可以灵活地控制结构体中各个成员的位数,从而节省内存空间并提高程序的效率。本篇博客将详细讲解C语言中位段的相关知识&a…
建立网站教程dedecms_v5.6室内装饰设计公司企业网站模板.rar
今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…
lc1035-不相交的线
难度:中等(中期)题目描述“连连看”
上下两个数组,相同的数可以连线,问在不交叉的情况下最多可以连多少条线示例
输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:
1 4 2
| \
1 2 4输入:nums1 = [2,5,1,…
Spring Boot 接入 Redis Sentinel:自动主从切换与读写分离实战(修复单机多实例与 Sentinel 配置坑) - 指南
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
智能中控终端-多环境联动的智慧管控中枢
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …