天津市网站建站制作/宁波企业seo服务

天津市网站建站制作,宁波企业seo服务,长春网站seo,网络营销方案的制定文章目录 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.…

文章目录

  • 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.mzph.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…

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的标准…

双指针---《移动零》

目录 文章前言 题目描述 算法原理讲解 忽略限制条件的解法 原理讲解 思路总结 代码展示 双指针解法 原理讲解 思路总结 代码展示 大总结 &#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;以及如何结合工厂方法模式来优化代码…

田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)

田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求&#xff1a; 传统幼苗检测依赖人工&#xff0c;效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战&#xff1a;…

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

如何在Linux CentOS上安装和配置Redis 大家好&#xff0c;我是曾续缘。欢迎来到本教程&#xff01;今天我将向您介绍在Linux CentOS上安装和配置Redis的详细步骤。Redis是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列和数据持久化等应用场景。让我们一起开始吧&…

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作&#xff0c;帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

使用Gitee Go流水线部署个人项目到服务器指南

使用Gitee Go流水线部署个人项目到服务器指南 前言&#xff01;&#xff01;&#xff01; 本文解决的问题&#xff1a; 你有一台ECS服务器&#xff0c;你在上面部署了一个Java服务也就是一个jar&#xff0c;你觉着你每次手动本地打包&#xff0c;上传&#xff0c;在通过命令去…

在 ASP .NET Core 9.0 中使用 Scalar 创建漂亮的 API 文档

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90407900 Scalar 是一款可帮助我们为 API 创建精美文档的工具。与感觉有些过时的默认 Swagger 文档不同&#xff0c;Scalar 为 API 文档提供了全新而现代的 UI。其简洁的设计让开发人员可以轻松找到测试…

Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)

一、消费流程图 消息在消费出现异常的时候&#xff0c;将一直保留在消息队列&#xff0c;所以你会看到以下奇怪的现象&#xff1a; 消息队列仅有5个消息&#xff0c; 投递速度也非常快&#xff0c;结果却一直无法消费掉。 二、重试策略 重试机制的使用场景&#xff1a;重试机制…

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…

【赵渝强老师】达梦数据库的数据库对象

达梦数据库中包含各种数据库对象&#xff0c;主要分为两大类型&#xff1a;基本数据库对象和复杂数据库对象。下面分别进行介绍。 视频讲解如下 【赵渝强老师】达梦数据库的数据库对象 一、 基本数据库对象 常见的基本数据库对象有&#xff1a;表、索引、视图、序列、同义词等…

26考研——树与二叉树_树、森林(5)

408答疑 文章目录 二、树、森林树的基本概念树的定义和特性树的定义树的特性 基本术语树的基本术语和概念祖先、子孙、双亲、孩子、兄弟和堂兄弟结点的层次、度、深度和高度树的度和高度分支结点和叶结点有序树和无序树路径和路径长度 森林的基本术语和概念森林的定义森林与树的…

【HarmonyOS Next之旅】DevEco Studio使用指南(六)

目录 1 -> 在模块中添加Ability 1.1 -> Stage模型添加UIAbility 1.1.1 -> 在模块中添加UIAbility 1.1.2 -> 在模块中添加Extension Ability 2 -> 创建服务卡片 2.1 -> 概述 2.2 -> 使用约束 2.3 -> 创建服务卡片 2.4 -> 创建动态/静态卡片…

Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)

1 主要目的 在Excel中&#xff0c;经常会遇到需要制作多级联动下拉菜单的情况&#xff0c;要求单元格内填写的内容只能从指定的多个选项中进行选择&#xff0c;并且需要设置多级目录&#xff0c;其中下级目录的选项内容要根据上级目录的填写内容确定&#xff0c;如下图所示&am…