文章目錄
- 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. 代碼實現
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 關鍵設計點
- LED控制接口統一
- 裝飾器鏈式組合
- 時間管理機制
- 資源管理完善
5.2 實現特點
- 函數指針實現多態
- 模塊化設計
- 效果可組合
- 代碼復用性高
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. 注意事項
- 時序控制精度
- 內存管理
- 硬件接口抽象
- 中斷處理
8. 改進建議
- 添加PWM控制
- 實現更多效果
- 優化時間管理
- 添加錯誤處理
9. 總結
裝飾器模式在LED控制系統中的應用,使得我們可以靈活地組合不同的LED效果,同時保持代碼的清晰和可維護性。這種模式特別適合需要動態組合多種LED效果的場景。
參考資料
- 《嵌入式系統設計》
- 《設計模式》
- 《單片機編程實踐》