模块间的通信机制是架构学习的重点, Call-back的应用无疑是最常见的, 由此引申出来的设计模式也非常之多, 如观察者模式, 这篇文章无疑是非常浅显的, 做这个总结, 也是为了将来引出工作中用到的Event配信机制. 后面涉及到通信的文章将会一起串烧.
Callback的目的是用来1 V N系统, 即一个系统要负责和N个子系统进行动作或者消息的交互. 目的是为了方便系统的维护.
第一部分 : 简单的 CallBack 机制
什么是 CallBack
字面含义 , 本来是往前调用的 , 结果又调回头去调用另外的东西。
引申 ==== 》 本来把参数传给某个函数,让函数执行 ( 向前执行 ), 结果这个函数却跑过去调用参数 ( 向后调用 ). 这里的参数可以是函数指针 , 对象的方法等 .
CallBack 现实的意义
如果操作是 1 v 1 的 . 那么无需 CallBack, 我们直接将动作或者消息传递给对方就可以了 . 考虑到 1 v N 的系统 , 显然不容易维护 ( 当 N 变成 N+M) 的时候 , 去一一配送动作,显然是不合适的。以家庭电力系统为例 , 电源要服务电视机,冰箱,洗衣机这么多受众 , 每个家电都按自己的标准行事 . 这样将很难调整他们的位置 . 房屋装修的工人,也不知道哪里放置一个插座。
CallBack 实质,统一标准规则下,充分实现个体的个性化 .
比如,以上面的家庭电源系统为例
统一的规则是 : 三角插座 .
个性化体现是 : 电冰箱应用 , 电风扇应用,电脑应用 , 电视机应用等 .
带来的优点 : 能在电源系统下,运营所有的电子产品 , 如图 :
介绍下代码如何实现 CallBack:
1. 利用函数指针实现的 CallBack 机制
/* * Application.cpp * * Created on: 2010-12-20 * Author: ostrichmyself * 应用代码, 注册, 并使用, RuleMaker.cpp中的代码. * 为简洁起见, 这里不定义头文件. 直接用外部声明的方式. */ #include "stdio.h" void callFunction(int (*rFun)(), int para); int (*rFun)(void); int implementFun(); int main() { printf("in main function/n"); //注册机制, 表明已经实现函数. 下面可以直接使用.(当然这里可以不需要注册, 直接传递也可以) //为了清晰的表达回调机制, 这里增加了所谓的"注册"动作 rFun = implementFun; //调用 callFunction(rFun, 1); }
/* * Implementation.cpp * * Created on: 2010-12-20 * Author: Administrator * 规则的实现函数. 按照RuleMaker中函数指针的模型, 实现了这样一个函数 */ #include <stdio.h> int implementFun() { printf("in implementFun"); return 0; }
/* * RuleMaker.cpp * * Created on: 2010-12-20 * Author: ostrichmyself * 规则制定, 这里定义了函数指针的接口, 但没有给出函数的定义. * 规则: * 调用任意参数为空, 返回为int类型的函数 */ void callFunction(int (*pFun)(), int para) { //这里就是一个回调; 调用别处实现的函数 //与普通函数调用, 是有区别的, 因为这里的函数是作为参数传入的 pFun(); }
2. 利用继承关系实现的回调机制 .
附参考文献:
1. 回调设计模式