读书人

spring系列之 回调函数的施用

发布时间: 2012-10-21 09:00:08 作者: rapoo

spring系列之 回调函数的使用

spring使用了大量的回调函数,如HibernateCallBack,打开你的eclipse,ctrl+shift+t,再输入*CallBack,你可以看到有多少地方在使用回调函数,下面分析一下大牛们为什么频繁使用这个CallBack函数。
废话少说,先来个例子说事儿。

?

view plain
  1. package?com.lixuehui.callbacktest;??
  2. ??
  3. public?interface?MySession?{??
  4. ?public?Object?createMyQuery();??
  5. }??
  6. ??
  7. ???
  8. ??
  9. package?com.lixuehui.callbacktest;??
  10. ??
  11. public?class?MySessionImpl?implements?MySession{??
  12. ?public?Object?createMyQuery(){??
  13. ??return?"Hello,World!";??
  14. ?}??
  15. }??
  16. ??
  17. ???
  18. ??
  19. package?com.lixuehui.callbacktest;??
  20. ??
  21. public?interface?MyHibernateCallBack?{??
  22. ?Object?doInHibernate(MySession?target);??
  23. }??
  24. ??
  25. ???
  26. ??
  27. package?com.lixuehui.callbacktest;??
  28. ??
  29. abstract?class?MyTemplete{??
  30. ?protected?MySession?createSession(){??
  31. ??return?new?MySessionImpl();//?模拟创建一个session??
  32. ?}??
  33. ??
  34. ?protected?Object?execute(MyHibernateCallBack?callback){??
  35. ??MySession?mySession?=?createSession();?//?模拟创建一个session??
  36. ??Object?object?=?callback.doInHibernate(mySession);??
  37. ??return?object;??
  38. ?}???
  39. }??
  40. ??
  41. class?TempClass?implements?MyHibernateCallBack?{??
  42. ?public?Object?doInHibernate(MySession?session)?{??
  43. ??return?session.createMyQuery();??
  44. ?}??
  45. }??
  46. ??
  47. ??
  48. public?class?Test?extends?MyTemplete{??
  49. ??
  50. ?public?static?void?main(String[]?args)?{??
  51. ??Object?object?=?new?Test().execute(new?MyHibernateCallBack(){??
  52. ???//这处new这个接口,创建一个匿名内部类,相当于new了一个实现MyHibernateCallBack接口的类,然后再将这个匿???名对象传给execute方法。??
  53. ???public?Object?doInHibernate(MySession?session){??
  54. ????return?session.createMyQuery();??
  55. ???}??
  56. ??});??
  57. ??System.out.println(object);??
  58. ?}??
  59. }??
  60. //Test类相当于:??
  61. public?class?Test?extends?MyTemplete?{??
  62. ??
  63. ?public?static?void?main(String[]?args){??
  64. ??TempClass?temp?=?new?TempClass();??
  65. ??Object?object?=?new?Test().execute(temp);??
  66. ??System.out.println(object);??
  67. ?}??
  68. }??

?
?不过这么写灵活度比较低,doInHibernate里的如果做另外的操作的话,就要重复修改TempClass的doInHibernate方法。
看到回调的好处了么?

?

我觉得这个回调的好处是:
通过创建匿名类,动态实现接口,并实现接口的方法,侧重点在于接口,不在乎实现接口的类,故采用匿名类。
如果你遇到了侧重点在于接口,而不在乎类实现的情况,就可以采取这种回调方式。

Oberser,swing的事件机制,以及java里的自定义事件机制,频繁用的都是回调.?
包括java里的main函数,也可以理解为回调?
那想想,为什么java *** 的时候就必须走main方法中呢,可见java ***的时候内部也是回调用的main,所以才跑到main方法里.main方法扔给二次开发人员,随意施展.

回调,回调,顾名思义:"你先实现吧,实现完了回头我调你".

读书人网 >软件架构设计

热点推荐