java--callback
??? 早有寫貼的打算,無奈,剛剛出來工作,也是初到北京!生活還不安定,根本沒有辦法來寫,終于回學(xué)校了!
??? 廢話少說,在北京時(shí),一位剛畢業(yè)的師兄,有一天問我:什么是CALLBACK!,說是面試時(shí),有好多個(gè)公司都問了這個(gè)問題!當(dāng)時(shí)我一時(shí)無語,只記著,在閱讀thinking in java是看到過有關(guān)他的介紹,但具體也說不清楚了,于是趕緊翻書,上網(wǎng)查資料。發(fā)現(xiàn)雖然都說的比較全面,但是都不是好理解!后來我又閱讀了c++中回調(diào)函數(shù)的概念,才對他有了一個(gè)模糊的認(rèn)識!
? 其實(shí)我們從字面意思來判斷,就已經(jīng)知道他大概的意思了,我從網(wǎng)上摘抄的定義是:軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用方要等待對方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說,被調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對方的接口(有待商榷);異步調(diào)用是一種類似消息或事件的機(jī)制,不過它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時(shí),會(huì)主動(dòng)通知客戶方(即調(diào)用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來實(shí)現(xiàn)異步消息的注冊,通過異步調(diào)用來實(shí)現(xiàn)消息的通知。是不是有點(diǎn)抽象,其實(shí)我們可以舉個(gè)簡單的例子:我寫個(gè)程序(也可能是個(gè)類,或者是個(gè)組件)稱為a,其中預(yù)留有回調(diào)函數(shù)接口,并封裝好了該程序。另外一個(gè)人B要讓a調(diào)用自己的程序b中的一個(gè)方法,于是,他通過我提供的接口回調(diào)自己b中的方法,目的達(dá)到。
??然后我們就可以寫程序了,
Codepublic?class?Caller?{?????
public?MyCallInterface?mc;?????
public?void?setCallfuc(MyCallInterface?mc)?{???????
?this.mc=?mc;????
?}?????
public?void?call(){this.mc.method();?????
}?
}????
//?我還需要定義一個(gè)接口,以便程序員B根據(jù)我的定義編寫程序?qū)崿F(xiàn)接口
public?interface?MyCallInterface?{?
public?void?method();
}?????
//于是,程序員B只需要實(shí)現(xiàn)這個(gè)接口就能達(dá)到回調(diào)的目的了
?public?class?B?implements?MyCallInterface?{?
public?void?method()?{?
System.out.println("回調(diào)實(shí)現(xiàn)");?????
}
?public?static?void?main(String?args[]){???????
?Caller?call?=?new?Caller();????????
call.setCallfuc(new?B());???????
?call.call();}?
}
?
OK,可以看到b實(shí)現(xiàn)了a回調(diào)他的方法!我們再來看個(gè)具體的例子,可能要復(fù)雜一點(diǎn)!有這樣的一個(gè)問題:
老板(Boss)讓工人(Worker)干完活告訴他干的情況如何。(來自網(wǎng)上的例子http://lavasoft.blog.51cto.com/62575/90453)
這是一個(gè)典型的回調(diào)問題,即工人要調(diào)用老板提供的接口,并且要老板調(diào)用學(xué)生的方法或?qū)傩?#xff0c;來了解工人的完成情況
代碼如下:
Code
public?interface?Event?{?
????/**?
?????*?返回發(fā)生事件信息?
?????*?
?????*?@return?事件信息?
?????*/?
????public?String?happendEvent();?
}
public?class?EventA?implements?Event?{?
????/**?
?????*?返回發(fā)生事件信息?
?????*?
?????*?@return?事件信息?
?????*/?
????public?String?happendEvent()?{?
????????return?"發(fā)生了事件?EventA!";?
????}?
}
public?class?EventB?implements?Event{?
????/**?
?????*?返回發(fā)生事件信息?
?????*?@return?事件信息?
?????*/?
????public?String?happendEvent()?{?
????????return?"發(fā)生了事件?EventB!";?
????}?
}
public?class?Worker?{?
????private?Event?event;????//事件?
????private?String?name;????//工人姓名?
????private?Boss?boss;??????//工人所屬的老板?
????public?Worker(String?name,?Boss?boss)?{?
????????this.name?=?name;?
????????this.boss?=?boss;?
????}?
????/**?
?????*?干活?
?????*/?
????public?void?doWork()?{?
????????System.out.println(name?+?"?is?doing?working");?
????????//工人挺辛苦,干著枯燥乏味的重復(fù)工作,哈哈?
????????for?(int?i?=?0;?i?<?2000000;?i++)?{?
????????????int?x?=?i?/?234?+?234;?
????????}?
????????System.out.println(name?+?"?was?finished?work.");?
????????//向老板說明發(fā)生的情況?
????????boss.getWorkerEvent(this,?event);?
????}?
????public?Event?getEvent()?{?
????????return?event;?
????}?
????public?void?setEvent(Event?event)?{?
????????this.event?=?event;?
????}?
????public?String?getName()?{?
????????return?name;?
????}?
????public?void?setName(String?name)?{?
????????this.name?=?name;?
????}?
}
?
public?class?Boss?{?
????private?String?name;?
????public?Boss(String?name)?{?
????????this.name?=?name;?
????}?
????/**?
?????*?老板接收工人的事件?
?????*?@param?worker?工人?
?????*?@param?event??事件?
?????*/?
????public?void?getWorkerEvent(Worker?worker,?Event?event)?{?
????????System.out.println("老板接收到事件信息:?"+worker.getName()?+?":?"?+?event.happendEvent());?
????}?
}
?
public?class?Test?{?
????public?static?void?main(String?args[]){?
????????//初始化老板和工人?
????????Boss?boss?=?new?Boss("老板");?
????????Worker?worker1=?new?Worker("張三",boss);?
????????Worker?worker2=?new?Worker("李四",boss);?
????????//捏造兩個(gè)事件?
????????Event?event1?=?new?EventA();?
????????Event?event2?=?new?EventB();?
????????//事件是工人發(fā)出的?
????????worker1.setEvent(event1);?
????????worker2.setEvent(event2);?
????????//工人干活,干完了通知老板干的情況如何?
????????worker1.doWork();?
????????worker2.doWork();?
????}?
}
?? 我們可以看到在boss中,我們回調(diào)了工人的happendEvent方法,一般我們都用接口來實(shí)現(xiàn)回調(diào)!
轉(zhuǎn)載于:https://www.cnblogs.com/hya1109/archive/2008/09/04/1284726.html
總結(jié)
以上是生活随笔為你收集整理的java--callback的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来计算在“云-端”
- 下一篇: Dns故障排除