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.rhkb.cn/news/38910.html

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

相关文章

Git 使用SSH登陆

一、SSH介绍 SSH连接相比于HTTP连接会简单一点&#xff0c;因为SSH连接通过了私钥与公钥进行身份认证&#xff0c;这样就不需要像HTTP一样&#xff0c;每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的&#xff0c;通过命令即可生成一个私钥和一个…

openharmony中hilog实证记录说明(3.1和5.0版本)

每次用这个工具hilog都有一些小用法记不清&#xff0c;需要花一些时间去查去分析使用方法&#xff0c;为了给丰富多彩的生活留出更多的时间&#xff0c;所以汇总整理共享来了&#xff0c;它来了它来了~~~~~~~~~ 开始是想通过3.1来汇总的&#xff0c;但实际测试发现openharmony…

UDP 协议

文章目录 UDP 协议简介数据包格式UDP 通信流程抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 UDP 协议 UDP 是一种面向无连接的传输层协议&#xff0c;属于 TCP/IP 协议簇的一种。…

数据结构之链表(双链表)

目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点&#xff1a; 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插&#xff1a; 头插&#xff1a; 4.双链表的尾删和头删 尾删&#xff1a; 头删&#xff1a; …

内存取证之windows-Volatility 3

一&#xff0c;Volatility 3下载 1.安装Volatility 3。 要求&#xff1a;python3.7以上的版本&#xff0c;我的是3,11&#xff0c;这里不说python的安装方法 使用 pip 安装 Volatility 3&#xff1a; pip install volatility3 安装完成后&#xff0c;验证安装&#xff1a; v…

Unity的JSON工具类+LitJson的引入及使用

C#使用JSON数据 数据存储&#xff08;序列化&#xff09;&#xff1a;将C#的数据格式&#xff0c;转化为JSON字符串&#xff0c;存储或传输 数据使用&#xff08;反序列化&#xff09;&#xff1a;将JSON字符串中存储的数据&#xff0c;转化为C#可用的数据格式&#xff0c;实现…

WX小程序

下载 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…

MyBatis 中 #{} 和 ${} 的区别详解

目录 1. #{} 和 ${} 的基本概念 1.1 #{} 1.2 ${} 2. #{} 和 ${} 的工作原理 2.1 #{} 的工作原理 2.2 ${} 的工作原理 3.共同点&#xff1a;动态 SQL 查询 4. 区别&#xff1a;处理方式和适用场景 4.1 处理方式 4.2 适用场景 &#xff08;1&#xff09;#{} 的适用场景…

【蓝桥杯速成】| 10.回溯切割

前面两篇内容我们都是在做有关回溯问题的组合应用 今天的题目主题是&#xff1a;回溯法在切割问题的应用 题目一&#xff1a;分割回文串 问题描述 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;请你将 s 分割成一些 子串&#xff…

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码 #include <stdio.h> #include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next, *prev; }Node;//初化链表…

开源视频剪辑工具,无损编辑更高效

LosslessCut 是一款基于 FFmpeg 开发的跨平台开源视频剪辑工具&#xff0c;致力于无损处理音视频文件。它无需重新编码即可完成剪切、合并、轨道编辑等操作&#xff0c;极大地保留了原始文件的质量&#xff0c;特别适合处理大体积视频&#xff0c;如无人机拍摄素材或长时录制内…

Java:Apache HttpClient中HttpRoute用法的介绍

当使用Apache HttpClient组件时&#xff0c;经常会用到它的连接池组件。典型的代码如下&#xff1a; PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connect…

EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代

在当今数字化时代&#xff0c;智能设备的普及和人们对实时通信需求的不断增长&#xff0c;推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势&#xff0c;在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…

Uthana,AI 3D角色动画生成平台

Uthana是什么 Uthana 是专注于3D角色动画生成的AI平台。平台基于简单的文字描述、参考视频或动作库搜索&#xff0c;快速为用户生成逼真的动画&#xff0c;支持适配任何骨骼结构的模型。Uthana 提供风格迁移、API集成和定制模型训练等功能&#xff0c;满足不同用户需求。平台提…

Python:多线程创建的语法及步骤

线程模块&#xff1a;import threading 线程类Thread参数&#xff1a;group(线程组) target&#xff1a;执行的目标的任务名 args&#xff1a;以元组的方式给执行任务进行传参 *args可以传任意多个参数 kwargs以字典方式给执行任务传参 name&#xff1a;线程名 步骤&…

Jupyter Notebook 常用命令(自用)

最近有点忘记了一些常见命令&#xff0c;这里就记录一下&#xff0c;懒得找了。 文章目录 一、文件操作命令1. %cd 工作目录2. %pwd 显示路径3. !ls 列出文件4. !cp 复制文件5. !mv 移动或重命名6. !rm 删除 二、代码调试1. %time 时间2. %timeit 平均时长3. %debug 调试4. %ru…

快速入手-基于Django的Form和ModelForm操作(七)

1、Form组件 2、ModelForm操作 3、给前端表单里在django里添加class相关属性值 4、前端 5、后端form 新增数据处理 6、更新数据处理

【Linux系统】Linux权限讲解!!!超详细!!!

目录 Linux文件类型 区分方法 文件类型 Linux用户 用户创建与删除 用户之间的转换 su指令 普通用户->超级用户(root) 超级用户(root) ->普通用户 普通账户->普通账户 普通用户的权限提高 sudo指令 注&#xff1a; Linux权限 定义 权限操作 1、修改文…

剑指小米特斯拉:秦L EV上市11.98万起

3月23日&#xff0c;比亚迪王朝网推出全新中级纯电轿车秦L EV&#xff0c;价格区间为11.98万-13.98万元&#xff0c;瞬间火爆市场。 依托e平台3.0 Evo技术赋能&#xff0c;秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势&#xff0c;直击年轻用户痛…

嵌入式学习(31)-Lora模块A39C-T400A30D1a

一、概述 A39C-T400A30D1a是一款410~490MHz&#xff0c;1W&#xff0c;具有高稳定性&#xff0c;工业级的无线串口模块。LORA扩频调制&#xff0c;实测传输距离最远可达10K米。该模块具备数据广播、数据监听、定点传输、主从模式、自动中继、定点唤醒等传输方式&#xff0c;支…