当前位置: 首页 > news >正文

用C语言实现适配器模式

适配器模式(Adapter Pattern)的核心是将一个接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类(或模块)能够一起工作。在C语言中,可通过封装不兼容的接口、提供统一的适配接口来实现。

C语言实现适配器模式的思路

  1. 目标接口(Target):客户端期望的统一接口(函数指针结构体)。
  2. 适配者(Adaptee):已存在的、接口不兼容的模块(如旧系统函数、第三方库)。
  3. 适配器(Adapter):实现目标接口,内部调用适配者的接口,完成接口转换。

示例:适配不同格式的日志库

假设客户端期望一个统一的日志接口(log_infolog_error),但现有两个日志库的接口不兼容:

  • 旧日志库:old_log(message, level)(级别用整数表示:1=INFO,2=ERROR)。
  • 新日志库:new_log(level, message)(级别用字符串表示:“INFO”、“ERROR”)。
步骤1:定义目标接口(客户端期望的接口)
// 目标接口:客户端期望的统一日志接口
typedef struct {void (*log_info)(const char* message);  // 打印INFO级日志void (*log_error)(const char* message); // 打印ERROR级日志
} LogTarget;
步骤2:定义适配者(不兼容的日志库)
#include <stdio.h>// 适配者1:旧日志库(接口:message在前,级别是整数)
void old_log(const char* message, int level) {const char* level_str = (level == 1) ? "INFO" : "ERROR";printf("[旧日志] %s: %s\n", level_str, message);
}// 适配者2:新日志库(接口:级别在前,级别是字符串)
void new_log(const char* level, const char* message) {printf("[新日志] %s: %s\n", level, message);
}
步骤3:实现适配器(将适配者接口转换为目标接口)
3.1 旧日志库适配器
// 旧日志库的适配器:实现LogTarget接口
static void old_adapter_log_info(const char* message) {// 调用旧日志库,转换参数(INFO对应级别1)old_log(message, 1);
}static void old_adapter_log_error(const char* message) {// 调用旧日志库,转换参数(ERROR对应级别2)old_log(message, 2);
}// 初始化旧日志适配器
LogTarget* old_log_adapter_create() {static LogTarget adapter; // 静态实例,避免动态分配adapter.log_info = old_adapter_log_info;adapter.log_error = old_adapter_log_error;return &adapter;
}
3.2 新日志库适配器
// 新日志库的适配器:实现LogTarget接口
static void new_adapter_log_info(const char* message) {// 调用新日志库,转换参数(级别字符串"INFO")new_log("INFO", message);
}static void new_adapter_log_error(const char* message) {// 调用新日志库,转换参数(级别字符串"ERROR")new_log("ERROR", message);
}// 初始化新日志适配器
LogTarget* new_log_adapter_create() {static LogTarget adapter;adapter.log_info = new_adapter_log_info;adapter.log_error = new_adapter_log_error;return &adapter;
}
步骤4:客户端使用(依赖目标接口,无需关心具体适配者)
// 客户端函数:仅依赖目标接口,不直接调用旧/新日志库
void client_code(LogTarget* logger) {logger->log_info("系统启动成功");logger->log_error("配置文件不存在");
}int main() {// 使用旧日志库(通过适配器)LogTarget* old_logger = old_log_adapter_create();printf("=== 使用旧日志库 ===\n");client_code(old_logger);// 使用新日志库(通过适配器)LogTarget* new_logger = new_log_adapter_create();printf("\n=== 使用新日志库 ===\n");client_code(new_logger);return 0;
}

输出结果

=== 使用旧日志库 ===
[旧日志] INFO: 系统启动成功
[旧日志] ERROR: 配置文件不存在=== 使用新日志库 ===
[新日志] INFO: 系统启动成功
[新日志] ERROR: 配置文件不存在

核心思想总结

  1. 接口转换:适配器通过封装适配者的接口(如old_lognew_log),将其转换为客户端期望的目标接口(LogTarget),屏蔽了接口差异。
  2. 解耦客户端与适配者:客户端仅依赖LogTarget接口,无需修改即可切换不同的日志库(旧→新),符合开放-封闭原则
  3. 复用现有模块:无需修改旧日志库或新日志库的代码,通过适配器使其能在新系统中复用。

扩展:对象适配器 vs 类适配器

  • 对象适配器(本示例):通过在适配器中调用适配者的函数(如old_log)实现,更灵活(可动态切换适配者)。
  • 类适配器(C语言模拟):若适配者是结构体,可让适配器结构体“继承”适配者结构体,直接复用其成员(类似面向对象的继承)。

C语言的适配器模式常用于整合旧系统、第三方库,或统一不同模块的接口,是系统兼容性设计的重要手段。

http://www.dtcms.com/a/508484.html

相关文章:

  • java求职学习day43
  • 做路牌的网站有哪些做调查的网站可以赚钱
  • 中原郑州网站建设iframe wordpress
  • h5游戏免费下载:功夫猫
  • 大模型-LORA模型详解
  • admin二维码字符过长导致显示失败问题
  • 监控主要的噪音有哪些,怎么系统的降噪?怎么设置告警规则更合理化
  • 温州企业建站系统模板工程招标信息网
  • 代刷网站是怎么做的保定公司做网站
  • vs2017 如何做网站注册一个软件需要多少钱
  • php网站开发做什么图标不显示wordpress
  • 200道高频Java 面试题汇总(含答案解析)
  • Telink 时钟模块
  • 阿尔茨海默病早期症状影像分类数据集
  • 网站首页的快照更新慢如何服务器ip地址做网站
  • 计算机网站开发参考文献绥德网站建设设计
  • Android 多语言切换最佳实践:从原理到封装与优化
  • 深圳微网站搭建爱站网络科技有限公司
  • 东莞网站设计公司建网站科技公司
  • 网站提供入口开发公司一季度汇报
  • 伤寒杂病论
  • 性能测试 | 性能测试工具Jmeter的认识和基础使用
  • 网站建设实现后台数据导出excel如何用asp编写网站后台
  • 宿迁哪家做网站好做学校教务处网站
  • PS插件大全:人像修图/调色特效/字体管理/抠图合成超全工具包,设计师效率直接拉满
  • 外卡收单那点事儿之Visa篇(10)
  • 有个做图片mv的网站56wordpress博客排行
  • 企业网上年检在网站怎么做做装修哪个网站推广好
  • STM32F103C8T6--深入GPIO
  • 国家级!悬镜安全入选两项“网络安全国家标准应用实践案例”