C語言-橋接模式詳解與實踐

文章目錄

  • C語言橋接模式詳解與實踐
    • 1. 什么是橋接模式?
    • 2. 為什么需要橋接模式?
    • 3. 實際應用場景
    • 4. 代碼實現
      • 4.1 UML 關系圖
      • 4.2 頭文件 (display_bridge.h)
      • 4.3 實現文件 (display_bridge.c)
      • 4.4 使用示例 (main.c)
    • 5. 代碼分析
      • 5.1 關鍵設計點
      • 5.2 實現特點
    • 6. 編譯和運行
    • 7. 注意事項
    • 8. 改進建議
    • 9. 總結
    • 參考資料

C語言橋接模式詳解與實踐

1. 什么是橋接模式?

橋接模式是一種結構型設計模式,它將抽象部分與其實現部分分離,使它們都可以獨立地變化。這種模式通過組合的方式建立兩個類之間的關系,而不是繼承。

2. 為什么需要橋接模式?

  • 分離抽象和實現
  • 提高可擴展性
  • 實現細節對客戶透明
  • 避免類爆炸
  • 支持獨立變化

3. 實際應用場景

  • 跨平臺圖形界面
  • 多種數據庫操作
  • 設備驅動程序
  • 多媒體播放器
  • 跨平臺文件系統

4. 代碼實現

4.1 UML 關系圖

Display
+show()
Device
+draw()
WindowsDisplay
+show()
LinuxDisplay
+show()
LCDDevice
+draw()
LEDDevice
+draw()

4.2 頭文件 (display_bridge.h)

#ifndef DISPLAY_BRIDGE_H
#define DISPLAY_BRIDGE_H// 顯示設備接口
typedef struct {void (*draw)(const char* data);const char* name;
} DisplayDevice;// 顯示平臺接口
typedef struct {DisplayDevice* device;void (*show)(struct Display* self, const char* data);const char* platform;
} Display;// 創建顯示設備
DisplayDevice* create_lcd_device(void);
DisplayDevice* create_led_device(void);// 創建顯示平臺
Display* create_windows_display(DisplayDevice* device);
Display* create_linux_display(DisplayDevice* device);// 銷毀接口
void destroy_device(DisplayDevice* device);
void destroy_display(Display* display);#endif // DISPLAY_BRIDGE_H

4.3 實現文件 (display_bridge.c)

#include "display_bridge.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// LCD設備實現
static void lcd_draw(const char* data) {printf("LCD設備顯示: %s\n", data);
}// LED設備實現
static void led_draw(const char* data) {printf("LED設備顯示: %s\n", data);
}// Windows平臺顯示實現
static void windows_show(Display* self, const char* data) {printf("Windows平臺 -> ");self->device->draw(data);
}// Linux平臺顯示實現
static void linux_show(Display* self, const char* data) {printf("Linux平臺 -> ");self->device->draw(data);
}// 創建LCD設備
DisplayDevice* create_lcd_device(void) {DisplayDevice* device = (DisplayDevice*)malloc(sizeof(DisplayDevice));device->draw = lcd_draw;device->name = "LCD";return device;
}// 創建LED設備
DisplayDevice* create_led_device(void) {DisplayDevice* device = (DisplayDevice*)malloc(sizeof(DisplayDevice));device->draw = led_draw;device->name = "LED";return device;
}// 創建Windows顯示平臺
Display* create_windows_display(DisplayDevice* device) {Display* display = (Display*)malloc(sizeof(Display));display->device = device;display->show = windows_show;display->platform = "Windows";return display;
}// 創建Linux顯示平臺
Display* create_linux_display(DisplayDevice* device) {Display* display = (Display*)malloc(sizeof(Display));display->device = device;display->show = linux_show;display->platform = "Linux";return display;
}// 銷毀設備
void destroy_device(DisplayDevice* device) {free(device);
}// 銷毀顯示平臺
void destroy_display(Display* display) {free(display);
}

4.4 使用示例 (main.c)

#include "display_bridge.h"
#include <stdio.h>int main() {// 創建顯示設備DisplayDevice* lcd = create_lcd_device();DisplayDevice* led = create_led_device();// 創建顯示平臺Display* windows_lcd = create_windows_display(lcd);Display* windows_led = create_windows_display(led);Display* linux_lcd = create_linux_display(lcd);Display* linux_led = create_linux_display(led);// 測試顯示printf("=== 顯示測試 ===\n");const char* test_data = "Hello, Bridge Pattern!";windows_lcd->show(windows_lcd, test_data);windows_led->show(windows_led, test_data);linux_lcd->show(linux_lcd, test_data);linux_led->show(linux_led, test_data);// 清理資源destroy_display(windows_lcd);destroy_display(windows_led);destroy_display(linux_lcd);destroy_display(linux_led);destroy_device(lcd);destroy_device(led);return 0;
}

5. 代碼分析

5.1 關鍵設計點

  1. 抽象與實現分離
  2. 接口清晰定義
  3. 組合關系建立
  4. 擴展性設計

5.2 實現特點

  1. 函數指針實現接口
  2. 平臺無關性
  3. 資源管理完善
  4. 使用簡單直觀

6. 編譯和運行

gcc -c display_bridge.c -o display_bridge.o
gcc -c main.c -o main.o
gcc display_bridge.o main.o -o bridge_demo

7. 注意事項

  1. 接口一致性
  2. 內存管理
  3. 錯誤處理
  4. 擴展性維護

8. 改進建議

  1. 添加錯誤處理機制
  2. 實現設備狀態管理
  3. 支持更多平臺
  4. 添加配置選項

9. 總結

橋接模式通過將抽象和實現分離,實現了它們的獨立變化。這種模式特別適合處理跨平臺或需要支持多種實現的場景。

參考資料

  1. 《設計模式:可復用面向對象軟件的基礎》
  2. 《C語言程序設計》
  3. 《跨平臺開發實踐》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74564.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74564.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

el-table 合并單元格

vue2使用el-table合并單元格&#xff0c;包括合并行、合并列 <el-table:header-cell-style"handerMethod":span-method"arraySpanMethod"cell-click"handleCellClick":data"tableData"style"width: 100%"><el-tabl…

網絡安全之vlan實驗

在對vlan進行一定的學習之后我們來練習一個小實驗來加深理解記憶 首先是對實驗進行一個搭建 第一部分&#xff1a;給交換機配置vlan 首先是sw1 [Huawei]vlan batch 2 to 5 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]port hybrid tagged vlan 2 [Huawei-GigabitEthe…

STM32 - 在機器人、自動化領域,LL庫相比HAL優勢明顯

在機器人控制器、電機控制器等領域的開發&#xff0c;需要高實時性、精細化控制或者對代碼執行效率、占用空間有較高要求。所以&#xff0c;大家常用的HAL庫明顯不符合要求。再加上&#xff0c;我們學習一門技術&#xff0c;一定要學會掌握底層的原理。MCU開發的底層就是寄存器…

mysql中show命令的使用

在 MySQL 中&#xff0c;SHOW 命令是一個非常實用的工具&#xff0c;用于查詢數據庫元數據&#xff08;如數據庫、表、列、索引等信息&#xff09;。以下是常見的 SHOW 命令及其用法&#xff1a; 1. 顯示所有數據庫 SHOW DATABASES;列出服務器上的所有數據庫。 2. 顯示當前數據…

RAG優化:python從零實現query轉換增強技術

本篇仍然是不依賴于LangChain等專用庫,利用python基本庫實現了三種查詢轉換技術 查詢重寫:使查詢更加具體和詳細,以提高搜索精度。回退提示:生成更廣泛的查詢以檢索有用的上下文信息。子查詢分解:將復雜查詢分解為更簡單的組件,以實現全面檢索。圖 1:RAG 中的查詢重寫(…

登錄驗證碼的接口實習,uuid,code.

UID是唯一標識的字符串,下面是百度百科關于UUID的定義&#xff1a; UUID是由一組32位數的16進制數字所構成&#xff0c;是故UUID理論上的總數為16322128&#xff0c;約等于3.4 x 10^38。也就是說若每納秒產生1兆個UUID&#xff0c;要花100億年才會將所有UUID用完。 UUID的標準…

HTML5 初探:新特性與本地存儲的魔法

HTML5 初探&#xff1a;新特性與本地存儲的魔法 作為一名前端新手&#xff0c;你可能聽說過 HTML5 這個名詞。它是 HTML 的第五代版本&#xff0c;不僅讓網頁變得更強大&#xff0c;還帶來了許多新功能和工具。今天&#xff0c;我們就來聊聊 HTML5 的新特性&#xff0c;以及它…

雙指針---《移動零》

目錄 文章前言 題目描述 算法原理講解 忽略限制條件的解法 原理講解 思路總結 代碼展示 雙指針解法 原理講解 思路總結 代碼展示 大總結 &#x1f4ab;只有認知的突破&#x1f4ab;才來帶來真正的成長&#x1f4ab;編程技術的學習&#x1f4ab;沒有捷徑&#x1f4ab;…

jangow-01-1.0.1靶機攻略

1.進行配置&#xff0c;按住shift&#xff0c;在圖一界面按e進去得到圖二 .ro 替換為 rw signie init/bin/bash ctrlx&#xff0c;ip a查看網卡信息&#xff0c;修改配置文件網卡信息 修改為如圖所示內容后按shift?然后輸入wq點擊回車退出&#xff0c;然后重啟靶機 2.在kali中…

安全上網沙箱:多方面解決政企私的上網問題

在數字化的浪潮中&#xff0c;網絡已成為我們工作與生活不可或缺的一部分。然而&#xff0c;網絡的便捷也伴隨著諸多安全隱患&#xff0c;尤其是對于企業、個人以及政企機構而言&#xff0c;安全上外網成為了至關重要的課題。 隔離保護&#xff1a;構建安全堡壘 沙箱技術在內網…

C++ string的模擬實現

Hello!!大家早上中午晚上好&#xff0c;昨天復習了string的使用&#xff0c;今天來模擬實現一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我們需要一個string的頭文件用來做變量、函數、類等聲明&#xff1b;再需要一個test文件來做測試,還需…

Java 中裝飾者模式與策略模式在埋點系統中的應用

前言 在軟件開發中&#xff0c;裝飾者模式和策略模式是兩種常用的設計模式&#xff0c;它們在特定的業務場景下能夠發揮巨大的作用。本文將通過一個實際的埋點系統案例&#xff0c;探討如何在 Java 中運用裝飾者模式和策略模式&#xff0c;以及如何結合工廠方法模式來優化代碼…

【3-22 list 詳解STL C++ 】

先看代碼&#xff0c;常用的就是代碼中有的那些 #include <bits/stdc.h> using namespace std; int main() {list<int> mylist;for(int i0;i<5;i){mylist.push_back(i);//TODO}for(const auto&i:mylist)cout<<i<<\n;//fanzhuanreverse(mylist.…

田間機器人幼苗視覺檢測與護苗施肥裝置研究(大綱)

田間機器人幼苗視覺檢測與護苗施肥裝置研究 基于多光譜視覺與精準施肥的農業機器人系統設計 第一章 緒論 1.1 研究背景與意義 農業智能化需求&#xff1a; 傳統幼苗檢測依賴人工&#xff0c;效率低且易遺漏弱苗/病苗施肥不精準導致資源浪費和環境污染 技術挑戰&#xff1a;…

如何在Linux CentOS上安裝和配置Redis

如何在Linux CentOS上安裝和配置Redis 大家好&#xff0c;我是曾續緣。歡迎來到本教程&#xff01;今天我將向您介紹在Linux CentOS上安裝和配置Redis的詳細步驟。Redis是一個高性能的鍵值存儲系統&#xff0c;常用于緩存、消息隊列和數據持久化等應用場景。讓我們一起開始吧&…

requests庫post方法怎么傳params類型的參數

在使用 requests 庫的 post 方法時&#xff0c;params 類型的參數通常用于在 URL 中作為查詢字符串傳遞。這與 data 或 json 參數不同&#xff0c;后者是放在請求體中的。下面詳細介紹如何在使用 post 方法時傳遞 params 參數。 使用 params 參數 params 參數接受一個字典或包…

C++常見問題與思考

TLS&#xff08;線程本地存儲&#xff09;原理 線程本地存儲&#xff08;Thread Local Storage&#xff0c;TLS&#xff09;是一種機制&#xff0c;它允許每個線程擁有自己獨立的變量實例&#xff0c;這些變量的生命周期與線程相同。也就是說&#xff0c;不同線程對同一個 TLS…

如何快速下載并安裝 Postman?

從下載、安裝、啟動 Postman 這三個方面為大家詳細講解下載安裝 Postman 每一步操作&#xff0c;幫助初學者快速上手。 Postman 下載及安裝教程(2025最新)

使用Gitee Go流水線部署個人項目到服務器指南

使用Gitee Go流水線部署個人項目到服務器指南 前言&#xff01;&#xff01;&#xff01; 本文解決的問題&#xff1a; 你有一臺ECS服務器&#xff0c;你在上面部署了一個Java服務也就是一個jar&#xff0c;你覺著你每次手動本地打包&#xff0c;上傳&#xff0c;在通過命令去…

Linux第一節:Linux系統編程入門指南

摘要 本文面向Linux初學者&#xff0c;系統講解操作系統核心概念、Shell命令實戰、權限管理精髓及目錄結構解析。通過思維導圖命令示例原理解析的方法&#xff0c;幫助開發者快速構建Linux知識體系&#xff0c;掌握生產環境必備技能。 一、Linux的前世今生&#xff1a;從實驗室…