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