打印
[应用方案]

编程中动态接口技术

[复制链接]
40|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 LightInterfaceStruct  lightInterface;

  • /**********************************************
  • * 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_light  Turn On\n");
  • }

  • static void turnOff(void)
  • {
  •     printf("Advan_light  Turn Off\n");
  • }

  • LightInterfaceStruct  Advan_light  =
  • {
  •     turnOn,
  •     turnOff,
  • };


  • //File_Name:  Advan_Light.h
  • /**********************************************
  • * Decription:高级灯接口驱动程序
  • *********************************************/  
  • #ifndef __ADVAN_LIGHT_H__
  • #define __ADVAN_LIGHT_H_
  • #include "Signal_Light.h"

  • extern LightInterfaceStruct  Advan_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");
  • }

  • LightInterfaceStruct  Normal_light  =
  • {
  •     turnOn,
  •     turnOff,
  • };

  • //File_Name:  Normal_Light.h
  • /**********************************************
  • * Decription:普通灯接口驱动程序
  • *********************************************/
  • #ifndef __NORMAL_LIGHT_H__
  • #define __NORMAL_LIGHT_H__

  • #include "Signal_Light.h"

  • extern LightInterfaceStruct  Normal_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;
  • }



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

3157

帖子

1

粉丝