编程中动态接口技术
接口-在大家平时的编程中应该是经常看到或者听到(比如说同事之间配合的一起完成一个项目的软件的时候经常听到"你把接口写好我来调用就行了"!),可见实现一个好的接口对于程序之间是非常重要的。那么我们是不是实现越多的接口就越好呢?显然不是这样的,我们昨天提到了软件设计中的"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]