婚恋网站上认识人 带你做原油交易/今日财经新闻

婚恋网站上认识人 带你做原油交易,今日财经新闻,多个网站 支付宝接口,网站引导页利弊文章目录 C语言装饰器模式详解与实践 - LED控制系统1. 什么是装饰器模式?2. 为什么需要装饰器模式?3. 实际应用场景4. 代码实现4.1 头文件 (led_decorator.h)4.2 实现文件 (led_decorator.c)4.3 使用示例 (main.c) 5. 代码分析5.1 关键设计点5.2 实现特点…

文章目录

  • C语言装饰器模式详解与实践 - LED控制系统
    • 1. 什么是装饰器模式?
    • 2. 为什么需要装饰器模式?
    • 3. 实际应用场景
    • 4. 代码实现
      • 4.1 头文件 (led_decorator.h)
      • 4.2 实现文件 (led_decorator.c)
      • 4.3 使用示例 (main.c)
    • 5. 代码分析
      • 5.1 关键设计点
      • 5.2 实现特点
    • 6. 编译和运行
    • 7. 注意事项
    • 8. 改进建议
    • 9. 总结
    • 参考资料

C语言装饰器模式详解与实践 - LED控制系统

1. 什么是装饰器模式?

装饰器模式允许我们动态地向对象添加新的功能,而不改变其原有结构。在LED控制系统中,我们可以通过装饰器模式实现不同的LED效果叠加。

2. 为什么需要装饰器模式?

  • 动态添加LED效果
  • 效果可以自由组合
  • 不修改原有代码
  • 符合开闭原则
  • 代码复用性高

3. 实际应用场景

  • LED状态指示
  • 设备运行状态显示
  • 警告信号显示
  • 用户界面反馈
  • 调试信息显示

4. 代码实现

LedController
+set_state()
+update()
+destroy()
BasicLed
-pin
-state
LedDecorator
-wrapped
BlinkLed
-interval
-counter
-state
BreathLed
-period
-counter
SosLed
-counter
-pattern_pos
-pattern
-pattern_length

4.1 头文件 (led_decorator.h)

#ifndef LED_DECORATOR_H
#define LED_DECORATOR_H#include <stdint.h>
#include <stdbool.h>// LED控制接口
typedef struct {void (*set_brightness)(void* self, uint8_t level);void (*update)(void* self);void (*destroy)(void* self);
} LedController;// 基础LED控制器
typedef struct {LedController base;uint8_t pin;         // LED引脚uint8_t brightness;  // 当前亮度
} BasicLed;// LED装饰器基类
typedef struct {LedController base;LedController* wrapped;
} LedDecorator;// 创建基础LED控制器
LedController* create_basic_led(uint8_t pin);// 创建闪烁装饰器
LedController* create_blink_led(LedController* wrapped, uint16_t interval_ms);// 创建呼吸灯装饰器
LedController* create_breath_led(LedController* wrapped, uint16_t period_ms);// 创建渐变装饰器
LedController* create_fade_led(LedController* wrapped, uint16_t fade_time_ms);// 销毁LED控制器
void destroy_led_controller(LedController* controller);#endif // LED_DECORATOR_H

4.2 实现文件 (led_decorator.c)

#include "led_decorator.h"
#include <stdio.h>
#include <stdlib.h>// 模拟硬件操作
static void hw_set_pin(uint8_t pin, uint8_t level) {printf("设置引脚 %d 亮度为 %d\n", pin, level);
}// 基础LED控制器实现
static void basic_set_brightness(void* self, uint8_t level) {BasicLed* led = (BasicLed*)self;led->brightness = level;hw_set_pin(led->pin, level);
}static void basic_update(void* self) {// 基础LED不需要更新
}static void basic_destroy(void* self) {free(self);
}// 闪烁装饰器实现
typedef struct {LedDecorator base;uint16_t interval;uint16_t counter;bool state;
} BlinkLed;static void blink_set_brightness(void* self, uint8_t level) {BlinkLed* led = (BlinkLed*)self;led->base.wrapped->set_brightness(led->base.wrapped, level);
}static void blink_update(void* self) {BlinkLed* led = (BlinkLed*)self;led->counter++;if (led->counter >= led->interval) {led->counter = 0;led->state = !led->state;led->base.wrapped->set_brightness(led->base.wrapped, led->state ? 255 : 0);}
}static void blink_destroy(void* self) {BlinkLed* led = (BlinkLed*)self;destroy_led_controller(led->base.wrapped);free(led);
}// 呼吸灯装饰器实现
typedef struct {LedDecorator base;uint16_t period;uint16_t counter;
} BreathLed;static void breath_set_brightness(void* self, uint8_t level) {BreathLed* led = (BreathLed*)self;led->base.wrapped->set_brightness(led->base.wrapped, level);
}static void breath_update(void* self) {BreathLed* led = (BreathLed*)self;led->counter++;if (led->counter >= led->period) {led->counter = 0;}// 使用正弦波实现呼吸效果float phase = (float)led->counter / led->period * 3.14159f * 2;uint8_t brightness = (uint8_t)((sinf(phase) + 1.0f) * 127.5f);led->base.wrapped->set_brightness(led->base.wrapped, brightness);
}static void breath_destroy(void* self) {BreathLed* led = (BreathLed*)self;destroy_led_controller(led->base.wrapped);free(led);
}// 创建函数实现
LedController* create_basic_led(uint8_t pin) {BasicLed* led = (BasicLed*)malloc(sizeof(BasicLed));led->base.set_brightness = basic_set_brightness;led->base.update = basic_update;led->base.destroy = basic_destroy;led->pin = pin;led->brightness = 0;return (LedController*)led;
}LedController* create_blink_led(LedController* wrapped, uint16_t interval_ms) {BlinkLed* led = (BlinkLed*)malloc(sizeof(BlinkLed));led->base.base.set_brightness = blink_set_brightness;led->base.base.update = blink_update;led->base.base.destroy = blink_destroy;led->base.wrapped = wrapped;led->interval = interval_ms;led->counter = 0;led->state = false;return (LedController*)led;
}LedController* create_breath_led(LedController* wrapped, uint16_t period_ms) {BreathLed* led = (BreathLed*)malloc(sizeof(BreathLed));led->base.base.set_brightness = breath_set_brightness;led->base.base.update = breath_update;led->base.base.destroy = breath_destroy;led->base.wrapped = wrapped;led->period = period_ms;led->counter = 0;return (LedController*)led;
}void destroy_led_controller(LedController* controller) {if (controller && controller->destroy) {controller->destroy(controller);}
}

4.3 使用示例 (main.c)

#include "led_decorator.h"
#include <stdio.h>
#include <windows.h>  // 用于Sleep函数void simulate_time(LedController* led, int ms) {printf("\n模拟运行 %d ms:\n", ms);for (int i = 0; i < ms; i += 100) {led->update(led);Sleep(100);  // 模拟时间流逝}
}int main() {// 创建基础LED(使用引脚13)LedController* led = create_basic_led(13);printf("=== 测试基础LED ===\n");led->set_brightness(led, 128);  // 设置50%亮度printf("\n=== 测试闪烁LED ===\n");led = create_blink_led(led, 500);  // 500ms闪烁间隔simulate_time(led, 2000);  // 运行2秒printf("\n=== 测试呼吸LED ===\n");led = create_breath_led(led, 2000);  // 2000ms呼吸周期simulate_time(led, 3000);  // 运行3秒// 清理资源destroy_led_controller(led);return 0;
}

5. 代码分析

5.1 关键设计点

  1. LED控制接口统一
  2. 装饰器链式组合
  3. 时间管理机制
  4. 资源管理完善

5.2 实现特点

  1. 函数指针实现多态
  2. 模块化设计
  3. 效果可组合
  4. 代码复用性高

6. 编译和运行

gcc -c led_decorator.c -o led_decorator.o
gcc -c main.c -o main.o
gcc led_decorator.o main.o -o led_demo

7. 注意事项

  1. 时序控制精度
  2. 内存管理
  3. 硬件接口抽象
  4. 中断处理

8. 改进建议

  1. 添加PWM控制
  2. 实现更多效果
  3. 优化时间管理
  4. 添加错误处理

9. 总结

装饰器模式在LED控制系统中的应用,使得我们可以灵活地组合不同的LED效果,同时保持代码的清晰和可维护性。这种模式特别适合需要动态组合多种LED效果的场景。

参考资料

  1. 《嵌入式系统设计》
  2. 《设计模式》
  3. 《单片机编程实践》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go常见问题与回答(下)

文章目录 1、通过指针变量 p 访问其成员变量 name&#xff0c;有哪几种方式&#xff1f;2、代码&#xff0c;说出结果3、扩容提&#xff0c;代码&#xff0c;说出结果4、指出下面这段代码的错误之处5、是否通过编译6、关于字符串连接&#xff0c;下面语法正确的是7、关于iota&a…

JVM 核心知识点总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

SQL中体会多对多

我们可以根据学生与课程多对多关系的数据库模型&#xff0c;给出实际的表数据以及对应的查询结果示例&#xff0c;会用到JOINLEFT JOIN两种连接 1. 学生表&#xff08;students&#xff09; student_idstudent_name1张三2李四3王五 2. 课程表&#xff08;courses&#xff09…

无人机与传统巡检优劣势对比!

一、无人机巡检的优势 1. 高效性 覆盖范围广&#xff1a;可快速扫描大范围区域&#xff08;如电力线路、管道、农田等&#xff09;&#xff0c;尤其适合复杂地形&#xff08;山区、沼泽等&#xff09;。 速度快&#xff1a;飞行速度远高于人工巡检&#xff0c;缩短任务周期…

DrRacket是一款专为Scheme和Racket编程语言设计的集成开发环境(IDE)

DrRacket是一款专为Scheme和Racket编程语言设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由瑞士苏黎世联邦理工学院开发。它不仅是初学者学习编程的理想工具&#xff0c;也适用于专业级开发‌。 安装DrRacket 请访问https://download.racket-lang.org安装Racke…

【Tiny RDM】Redis客户端工具

Tiny RDM Tiny RDM是一款现代化、轻量级、跨平台的Redis客户端&#xff0c;支持Mac、Windows和Linux&#xff0c;目前在Github上已有10kStar。 Github 项目地址&#xff1a; https://github.com/tiny-craft/tiny-rdm 功能特性 极度轻量&#xff0c;基于Webview2&#xff0c…

ctfshow REVERSE re2 萌新赛 内部赛 七夕杯 WP

目录 re2 萌新赛 flag白给 签退 数学不及格 内部赛 批量生产的伪劣产品 来一个派森 好好学习 天天向上 屏幕裂开了 七夕杯 逆向签到 easy_magic re2 ida分析主函数&#xff0c;将flag.txt内容加密写入enflag.txt 这是密钥加密过程 标准rc4加密 简单异或解…

【Linux】线程库

一、线程库管理 tid其实是一个地址 void* start(void* args) {const char* name (const char *)args;while(true){printf("我是新线程 %s &#xff0c;我的地址&#xff1a;0x%lx\n",name,pthread_self());sleep(1);}return nullptr; }int main() {pthread_t tid…

文件上传的小点总结(1)

2.文件类型绕过 问题插入&#xff1a;BP无法拦截本地流量 ①插件限制 不代理的地址列表通常写有localhost和127.0.0.1&#xff0c;把本地的全都删掉&#xff0c;然后应用保存。 ②浏览器限制 Firefox浏览器设置&#xff1a;检查浏览器代理配置和proxy listeners都没问题后&…

AI基础01-文本数据采集

本篇文章是学习文本数据的采集&#xff0c;作为人工智能训练师或者数据分析师有时需要先获取数据&#xff0c;然后进行数据清洗、数据标注。很明显数据采集是后续步骤的基础。 1&#xff09;数据采集定义 数据采集&#xff1a;data acquisition&#xff0c;DAQ 又称为数据获取…

深度学习Python编程:从入门到工程实践

第一章 Python语言概述与生态体系 1.3 Python在工业界的应用场景 # 示例:使用FastAPI构建RESTful接口 from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: float@app.post("/items/") async def cr…

使用CSS3实现炫酷的3D翻转卡片效果

使用CSS3实现炫酷的3D翻转卡片效果 这里写目录标题 使用CSS3实现炫酷的3D翻转卡片效果项目介绍技术要点分析1. 3D空间设置2. 核心CSS属性3. 布局和定位 实现难点和解决方案1. 3D效果的流畅性2. 卡片内容布局3. 响应式设计 性能优化建议浏览器兼容性总结 项目介绍 在这个项目中…

【读书笔记】华为《从偶然到必然》

note 华为的成功并非偶然&#xff0c;而是通过IPD体系、投资组合管理、平台战略等系统性工具&#xff0c;将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念&#xff0c;揭示了企业规模扩张与管理能力匹配的深层规律&#xff0c;为高科技企业提供了可借鉴…

HashMap添加元素的流程图

文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构&#xff08;链表还是红黑树&#xff09;5. 判断链表长度是否超过 …

Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…

FFmpeg + ‌Qt‌ 简单视频播放器代码

一个基于 ‌FFmpeg 4.x‌ 和 ‌Qt‌ 的简单视频播放器代码示例&#xff0c;实现视频解码和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg库界面&#xff0c;视频解码支持软解和硬解方式。 2&#xff09;QImage/QPixmap显示视频图片。 ‌1. Qt 项目配置&#xff08;.pro 文件&…

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网&#xff0c;将我们与世界的每一个角落紧密相连。然而&#xff0c;当某些与自己名字相关的资料不再希望被公众轻易检索到时&#xff0c;如何在百度搜索中有效“隐身”&#xff0c;成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…

[贪心算法]最长回文串 增减字符串匹配 分发饼干

1.最长回文串 我们可以存下每个字母的个数&#xff0c;然后分类讨论 如果是奇数就减一加到结果中如果是偶数就直接加入即可 最后判断长度跟原字符串的差距&#xff0c;如果小于原数组说明有奇数结果1 class Solution { public:int longestPalindrome(string s) {int ret0;//1.计…

目标检测中的非极大值抑制(NMS)原理与实现解析

一、技术背景 在目标检测任务中&#xff0c;模型通常会对同一目标生成多个重叠的候选框&#xff08;如锚框或预测框&#xff09;。非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09; 是一种关键的后处理技术&#xff0c;用于去除冗余的检测结果&#xff0c;保…

Linux 启动Jar脚本设置开机自启【超级详细】

Linux 启动Jar脚本&&设置开机自启【超级详细】 概要服务器开机自启服务重启脚本 概要 最近在Linux服务器中部署了一个项目&#xff08;单机版&#xff09;&#xff0c;每次更新服务的时候需要用到好几个命令&#xff0c;停止服务&#xff0c;再重启&#xff0c;并且服…