找回密码
 立即注册
首页 业界区 业界 Dependency inversion principle(DIP依赖倒置原则) ...

Dependency inversion principle(DIP依赖倒置原则)

庾芷秋 2026-2-23 22:55:01
一.what is dependency inversion principle( DIP依赖倒置原则 )

DIP 是指高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。


二.DIP的设计准则


  • 高层模块不应该依赖于低层模块:高层模块(如业务逻辑)不应该直接依赖于低层模块(如芯片SDK)。相反,它们应该依赖于抽象(接口或抽象类)。
  • 抽象不应该依赖具体实现
  • 细节应该依赖于抽象:具体实现(如类或函数)应该依赖于抽象(接口或抽象类),而不是直接依赖于其他具体实现。

三.举例

3.1 设备开关反例

不符合 DIP 的写法(高层switch.c直接依赖低层具体实现light.h),Switch 模块硬编码依赖了具体的 Light 实现,换成风扇、蜂鸣器就得改 Switch 代码。
  1. // light.h / light.c
  2. void Light_On()  { /* 点亮 GPIO */ }
  3. void Light_Off() { /* 熄灭 GPIO */ }
  4. // switch.c (高层模块)
  5. #include "light.h"
  6. void Switch_Press() {
  7.     static int state = 0;
  8.     state = !state;
  9.     if (state) Light_On();
  10.     else       Light_Off();
  11. }
复制代码
3.2 设备开关符合 DIP 的写法

高层(switch.c、switch.h)依赖抽象层(device.h),低层的具体实现(led.c、buzzer.c)也依赖抽象层(device.h)。






device.h(抽象层)
点击查看代码
  1. // device.h   ← 抽象层(接口定义)
  2. #ifndef DEVICE_H
  3. #define DEVICE_H
  4. typedef struct {
  5.     void (*turn_on)(void);   // 函数指针
  6.     void (*turn_off)(void);
  7. } DeviceOperations;
  8. void Switch_Press(const DeviceOperations* dev);
  9. #endif
复制代码


switch.c(高层模块只依赖抽象)
点击查看代码
  1. // switch.c
  2. #include "device.h"
  3. #include <stdio.h>
  4. static int state = 0;
  5. void Switch_Press(const DeviceOperations* dev) {
  6.     state = !state; /*只做演示,实际每个设备都需维护一个状态*/
  7.     if (state) {
  8.         printf("Switch: ON → ");
  9.         dev->turn_on();
  10.     } else {
  11.         printf("Switch: OFF → ");
  12.         dev->turn_off();
  13.     }
  14. }
复制代码


led.c(低层模块也依赖抽象)
点击查看代码
  1. // led.c   ← 具体低层实现1
  2. #include <stdio.h>
  3. #include "device.h"
  4. static void Led_On(void)  { printf("LED 点亮\n"); }
  5. static void Led_Off(void) { printf("LED 熄灭\n"); }
  6. const DeviceOperations LedDevice = {
  7.     .turn_on  = Led_On,
  8.     .turn_off = Led_Off
  9. };
复制代码
buzzer.c
点击查看代码
  1. // buzzer.c   ← 具体低层实现2(可替换)
  2. #include <stdio.h>
  3. #include "device.h"
  4. static void Buzzer_On(void)  { printf("蜂鸣器鸣叫\n"); }
  5. static void Buzzer_Off(void) { printf("蜂鸣器静音\n"); }
  6. const DeviceOperations BuzzerDevice = {
  7.     .turn_on  = Buzzer_On,
  8.     .turn_off = Buzzer_Off
  9. };
复制代码


main.c(测试代码)
点击查看代码
  1. // main.c
  2. #include "device.h"
  3. #include "switch.c"   // 为了演示,实际项目中用 .h + .c 分离
  4. extern const DeviceOperations LedDevice;
  5. extern const DeviceOperations BuzzerDevice;
  6. int main(void) {
  7.     printf("使用 LED 设备:\n");
  8.     Switch_Press(&LedDevice);
  9.     Switch_Press(&LedDevice);
  10.     printf("\n使用 蜂鸣器 设备:\n");
  11.     Switch_Press(&BuzzerDevice);
  12.     Switch_Press(&BuzzerDevice);
  13.     return 0;
  14. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

昨天 10:42

举报

您需要登录后才可以回帖 登录 | 立即注册