design principle:java 回调与委派/委托机制
原文地址: http://blog.csdn.net/AndroidBluetooth/article/details/6937468
博客 design principle:模拟 android Button 控件点击事件 主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现。
委派,也可以叫做委托,从字面上来理解的话,应该是委托其他类做事情而自己不做或者只做一部分工作;而回调,就是调用自己的方法。
在 java 中,这两种机制很类似,你姑且可以认为它们就是一码事。
推荐一篇博文给大家: Java中委托事件模型
java 中,实现委派和回调都是通过接口来实现的。下面举个小例子吧!
该例子是这样的(只是一个例子):
ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派(或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。
总之,Rocket不做具体的事情。看实例代码:
IRocketDelegate.java源码
1
package
mark.zhang;
2
3
public
interface
IRocketDelegate {
4
5
public
abstract
long
startAtTime();
6
7
public
abstract
long
endAtTime();
8
9
public
abstract
void
sendDidFail();
10
}
共有三个方法,分别是用于计算 Rocket 发射时间、计算 Rocket 发射完毕的时间以及发送是否失败的。
Rocket.java源码
1
package
mark.zhang;
2
3
public
class
Rocket {
4
5
IRocketDelegate delegate =
null
;
6
7
public
Rocket(IRocketDelegate delegate) {
8
this
.delegate = delegate;
9
}
10
11
private
long
getRocketStartTime() {
12
long
startTime = delegate.startAtTime();
13
return
startTime;
14
}
15
16
private
long
getRocketEndTime() {
17
long
endTime = delegate.endAtTime();
18
return
endTime;
19
}
20
21
public
boolean
isOk() {
22
//
超时0.1秒为失败
23
if
(getRocketEndTime() - getRocketStartTime() >= 100) {
24
delegate.sendDidFail();
25
return
false
;
26
}
27
return
true
;
28
}
29
30
}
在这个类中,声明一个 IRocketDelegate 接口对象,使用该对象调用接口的方法。我们知道,接口不可以直接实例化,换句话说,实例化接口必须实现接口的所有方法。
那么,我们就把这些实现工作交给具体的发射者来完成。实现回调。
ProfessionalWorker.java源码
1
package
mark.zhang;
2
3
public
class
ProfessionalWorker
implements
IRocketDelegate {
4
5
@Override
6
public
long
startAtTime() {
7
System.out.println("startAtTime is call-back inProfessionalWorker!");
8
return
System.currentTimeMillis();
9
}
10
11
@Override
12
public
long
endAtTime() {
13
System.out.println("endAtTime is call-back in ProfessionalWorker!");
14
return
System.currentTimeMillis();
15
}
16
17
@Override
18
public
void
sendDidFail() {
19
System.out.println("ProfessionalWorker send Rocket fail !");
20
}
21
22
public
void
send() {
23
if
(
new
Rocket(
this
).isOk()) {
24
System.out.println("ProfessionalWorker send Rocket ok !");
25
}
26
}
27
}
SparetimeWorker.java源码
这个类采用内部类的方式完成。
Test.java
1
package
mark.zhang;
2
3
public
class
Test {
4
5
public
static
void
main(String[] args) {
6
new
ProfessionalWorker().send();
7
8
System.out.println("*********************************************");
9
10
new
SparetimeWorker().send();
11
}
12
}
显示结果
1
endAtTime is call-back in ProfessionalWorker!
2
startAtTime is call-back inProfessionalWorker!
3
ProfessionalWorker send Rocket ok !
4
*********************************************
5
endAtTime is call-back in SparetimeWorker!
6
startAtTime is call-back in SparetimeWorker !
7
SparetimeWorker send Rocket fail !
这就体现 Java 中的一句话 Don't call me,I'll call you. 其含义就是回调(或者委派/委托)。
android 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。

