sanfuzi 发表于 2025-2-22 19:32

编程中动态接口技术

接口-在大家平时的编程中应该是经常看到或者听到(比如说同事之间配合的一起完成一个项目的软件的时候经常听到"你把接口写好我来调用就行了"!),可见实现一个好的接口对于程序之间是非常重要的。

那么我们是不是实现越多的接口就越好呢?显然不是这样的,我们昨天提到了软件设计中的"SOLID"原则,其中提到了接口分离,不要太多臃肿。大家可以去看一下那篇对软件设计5大原则的简介。

动态接口技术,其实就是实现接口的可选择性和兼容性,也就是说我们的接口对于上层服务层来说不发生变化,不过我们所封装的底层却需要可变,可变在我们C语言程序中的表达就是变量的意思。那么普通数据的变化(包括数据内容,数据结构等变化)我们可以选择变量指针(或者说是数据指针);同时我们前面说了,程序是由数据和方法组成,那么我们的方法就由函数指针来取代。

从上面的结构图来看,上层应用程序访问的是我们的Signal_Light这个抽象的信号灯类型,然而这个信号灯抽象类型包括了三个接口,分别是方法接口,我们打包以后用函数指针即可实现,当我们使用普通Light的使用就只需要注册普通的的Light灯即可,使用高级的Light同样注册即可,往后的项目中可能底层还包括很多的参数使用,我们一方面可以使用数据指针进行选择,同时也可以把数据和方法都进行打包成数据进行注册即可。

参考代码如下:
1)信号灯接口:

[*]//File_Name:Signal_Light.h

[*]/**********************************************

[*] * Decription:信号灯抽象接口

[*] *********************************************/

[*]#ifndef __SIGNAL_LIGHT__

[*]#define __SIGNA_LIGHT__

[*]//接口统一函数指针类型定义

[*]typedef struct _tag_LightInterfaceStruct

[*]{

[*]    void (*TurnOn)(void);

[*]    void (*TurnOff)(void);

[*]} LightInterfaceStruct;

[*]

[*]#endif



[*]//File_Name:Signal_Light.c

[*]/**********************************************

[*] * Decription:信号灯抽象接口

[*] *********************************************/

[*] #include "Signal_Light.h"

[*] //信号灯接口

[*] static LightInterfaceStructlightInterface;

[*]

[*]/**********************************************

[*]* Fuction   : Register_Signal_Light

[*]* Decription:注册信号灯驱动

[*]*********************************************/

[*] void Register_Signal_Light(LightInterfaceStruct Light)

[*] {

[*]   lightInterface = Light;

[*] }

[*]/**********************************************

[*]* Fuction   : Signal_Light_TurnOn

[*]* Decription:信号灯给上层提供的打开灯服务

[*]*********************************************/

[*]void Signal_Light_TurnOn(void)

[*]{

[*]    lightInterface.TurnOn();

[*]}

[*]/**********************************************

[*]* Fuction   : Signal_Light_TurnOff

[*]* Decription:信号灯给上层提供的关闭灯服务

[*]*********************************************/

[*]void Signal_Light_TurnOff(void)

[*]{

[*]   lightInterface.TurnOff();

[*]}

2)不同底层函数接口(高级灯和正常灯):

[*]//File_Name:Advan_Light.c

[*]/**********************************************

[*] * Decription:高级灯接口驱动程序

[*] *********************************************/

[*] #include"Advan_Light.h"

[*]

[*]static void turnOn(void)

[*]{

[*]    printf("Advan_lightTurn On\n");

[*]}

[*]

[*]static void turnOff(void)

[*]{

[*]    printf("Advan_lightTurn Off\n");

[*]}

[*]

[*]LightInterfaceStructAdvan_light=

[*] {

[*]    turnOn,

[*]    turnOff,

[*] };



[*]//File_Name:Advan_Light.h

[*]/**********************************************

[*] * Decription:高级灯接口驱动程序

[*] *********************************************/

[*] #ifndef __ADVAN_LIGHT_H__

[*] #define __ADVAN_LIGHT_H_

[*] #include "Signal_Light.h"

[*]

[*] extern LightInterfaceStructAdvan_light;

[*]

[*] #endif


[*]//File_Name:Normal_Light.c

[*]/**********************************************

[*] * Decription:普通灯接口驱动程序

[*] *********************************************/

[*] #include"Normal_Light.h"

[*]

[*]static void turnOn(void)

[*]{

[*]    printf("Normal_light Turn On\n");

[*]}

[*]

[*]static void turnOff(void)

[*]{

[*]    printf("Normal_light Turn Off\n");

[*]}

[*]

[*]LightInterfaceStructNormal_light=

[*] {

[*]    turnOn,

[*]    turnOff,

[*] };


[*]//File_Name:Normal_Light.h

[*]/**********************************************

[*] * Decription:普通灯接口驱动程序

[*] *********************************************/

[*] #ifndef __NORMAL_LIGHT_H__

[*] #define __NORMAL_LIGHT_H__

[*]

[*] #include "Signal_Light.h"

[*]

[*] extern LightInterfaceStructNormal_light;

[*]

[*] #endif

3)测试代码


[*]//File_Name:main.c

[*]#include <stdio.h>

[*]#include <stdlib.h>

[*]#include "Normal_Light.h"

[*]#include "Advan_Light.h"

[*]

[*]/* run this program using the console pauser or add your own getch, system("pause") or input loop */

[*]

[*]int main(int argc, char *argv[]) {

[*]

[*]    //Main函数定位为上层服务函数

[*]

[*]    //注册信号灯类型

[*]    Register_Signal_Light(Normal_light);

[*]    //调用信号灯统一接口

[*]    Signal_Light_TurnOff();

[*]    Signal_Light_TurnOff();

[*]

[*]    //注册信号灯接口

[*]    Register_Signal_Light(Advan_light);

[*]    //调用信号灯统一接口

[*]    Signal_Light_TurnOff();

[*]    Signal_Light_TurnOff();

[*]

[*]

[*]    return 0;

[*]}

[*]


页: [1]
查看完整版本: 编程中动态接口技术