接《9.3.1Java回调 ·1》(概念)和《编程导论(Java)·9.3.1回调·2》什么是好莱坞法则
本文改写《回调·3》,因为Java8引入了Lambda Expressions
★一个回调函数/回调方法(简称回调、callback)是上层模块实现的,将被下层模块(反过来)“执行”的方法。
【回调,或隐式调用Implicit invocation(某些软件架构的作者使用的术语)】
例子:上层Client需要更新进度条——显示复制任务完成的进度时,下层模块Server如何将进度数据传递给上层的Client呢?
通常有两种解决方案: ①轮询;②回调或通知。【书上的图9-12,在一个包中定义了4个类型,按照分层的要求,应该把代码分别放在不同包中——这里修改了书上的相关内容(包括代码)。但是我就不方便截图了。】
在图9-11中,Client定义的方法callback(int),将被Server这个被调用者反过来调用。请注意图中的分层线,通常下层模块Server不知道上层定义的接口也不应该/能够直接调用上层接口。如何解决这个小问题呢?可以在公共模块/下层模块中设计一个抽象类或接口如IXxx,定义回调方法的规范,而Server调用公共模块IXxx的抽象方法callback(int)即可。换言之,Server不能够调用上层模块的方法,那么调用本层的IXxx的方法总是可以的。类型之间的关系如图9-12所示。
【不好画图啊,先这样将就一下】图9-12及下面的例程说明了Java中使用回调的基本结构。它由上层模块Client、TestCallback和下层被调用者Server和公共模块IClient组成。Client的callback(int) 方法被称为回调。而IClient定义的抽象方法callback(int) 被称为回调接口,大多数情况下,回调接口也简称回调。(书上原文:注意:通常公共模块、上层模块和下层模块均有自己的包,这里简单地将它们全部放在同一个包API.event中,仅仅为了方便地查看相关代码。在实践中&#x