design principle:java 回調(diào)與委派/委托機(jī)制
原文地址: http://blog.csdn.net/AndroidBluetooth/article/details/6937468
博客? design principle:模擬 android Button 控件點(diǎn)擊事件?? ?主要說了一下模擬 android 的 Listener 模式,其實(shí)這就是一種委派與回調(diào)機(jī)制的體現(xiàn)。
委派,也可以叫做委托,從字面上來理解的話,應(yīng)該是委托其他類做事情而自己不做或者只做一部分工作;而回調(diào),就是調(diào)用自己的方法。
在 java 中,這兩種機(jī)制很類似,你姑且可以認(rèn)為它們就是一碼事。
推薦一篇博文給大家:? Java中委托事件模型 ?
java 中,實(shí)現(xiàn)委派和回調(diào)都是通過接口來實(shí)現(xiàn)的。下面舉個(gè)小例子吧!
該例子是這樣的(只是一個(gè)例子):
ProfessionalWorker 、SparetimeWorker 負(fù)責(zé)發(fā)射 Rocket,Rocket 類通過接口 IRocketDelegate 委派(或者說是回調(diào))?ProfessionalWorker 、SparetimeWorker自己發(fā)射。
總之,Rocket不做具體的事情。看實(shí)例代碼:
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
}
共有三個(gè)方法,分別是用于計(jì)算 Rocket 發(fā)射時(shí)間、計(jì)算 Rocket 發(fā)射完畢的時(shí)間以及發(fā)送是否失敗的。
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
//
超時(shí)0.1秒為失敗
23
if
(getRocketEndTime() - getRocketStartTime() >= 100) {
24
delegate.sendDidFail();
25
return
false
;
26
}
27
return
true
;
28
}
29
30
}
在這個(gè)類中,聲明一個(gè) IRocketDelegate 接口對(duì)象,使用該對(duì)象調(diào)用接口的方法。我們知道,接口不可以直接實(shí)例化,換句話說,實(shí)例化接口必須實(shí)現(xiàn)接口的所有方法。
那么,我們就把這些實(shí)現(xiàn)工作交給具體的發(fā)射者來完成。實(shí)現(xiàn)回調(diào)。
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源碼
這個(gè)類采用內(nèi)部類的方式完成。
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
}
顯示結(jié)果
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 !
這就體現(xiàn) Java 中的一句話?Don't call me,I'll call you. 其含義就是回調(diào)(或者委派/委托)。
android 中很多這樣的用法,關(guān)于接口的好處還有很多,后續(xù)慢慢研究,記住一句話:面向?qū)ο竺嫦蚪涌诰幊獭?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

