design principle:java 回調與委派/委託機制

來源:互聯網
上載者:User

部落格好久沒有更新,自己也好久沒有寫代碼了。

慚愧!最近諸事不順,算了,不說廢話了,呵呵!

部落格 design principle:類比 android Button 控制項點擊事件   主要說了一下類比 android 的 Listener 模式,其實這就是一種委派與回調機制的體現。

委派,也可以叫做委託,從字面上來理解的話,應該是委託其他類做事情而自己不做或者只做一部分工作;而回調,就是調用自己的方法。

在 java 中,這兩種機制很類似,你姑且可以認為它們就是一碼事。

推薦一篇博文給大家: Java中委託事件模型  

java 中,實現委派和回調都是通過介面來實現的。下面舉個小例子吧!

該例子是這樣的(只是一個例子):

ProfessionalWorker 、SparetimeWorker 負責發射 Rocket,Rocket 類通過介面 IRocketDelegate 委派(或者說是回調) ProfessionalWorker 、SparetimeWorker自己發射。

總之,Rocket不做具體的事情。看執行個體代碼:

IRocketDelegate.java源碼

package mark.zhang;public interface IRocketDelegate {public abstract long startAtTime();public abstract long endAtTime();public abstract void sendDidFail();}

共有三個方法,分別是用於計算 Rocket 發射時間、計算 Rocket 發射完畢的時間以及發送是否失敗的。

Rocket.java源碼

package mark.zhang;public class Rocket {IRocketDelegate delegate = null;public Rocket(IRocketDelegate delegate) {this.delegate = delegate;}private long getRocketStartTime() {long startTime = delegate.startAtTime();return startTime;}private long getRocketEndTime() {long endTime = delegate.endAtTime();return endTime;}public boolean isOk() {// 逾時0.1秒為失敗if (getRocketEndTime() - getRocketStartTime() >= 100) {delegate.sendDidFail();return false;}return true;}}

在這個類中,聲明一個 IRocketDelegate 介面對象,使用該對象調用介面的方法。我們知道,介面不可以直接執行個體化,換句話說,執行個體化介面必須實現介面的所有方法。

那麼,我們就把這些實現工作交給具體的發射者來完成。實現回調。

ProfessionalWorker.java源碼

package mark.zhang;public class ProfessionalWorker implements IRocketDelegate {@Overridepublic long startAtTime() {System.out.println("startAtTime is call-back inProfessionalWorker!");return System.currentTimeMillis();}@Overridepublic long endAtTime() {System.out.println("endAtTime is call-back in ProfessionalWorker!");return System.currentTimeMillis();}@Overridepublic void sendDidFail() {System.out.println("ProfessionalWorker send Rocket fail !");}public void send() {if (new Rocket(this).isOk()) {System.out.println("ProfessionalWorker send Rocket ok !");}}}

SparetimeWorker.java源碼

package mark.zhang;public class SparetimeWorker {public void send() {boolean isOk = new Rocket(new IRocketDelegate() {@Overridepublic long startAtTime() {System.out.println("startAtTime is call-back in SparetimeWorker !");return System.currentTimeMillis();}@Overridepublic long endAtTime() {System.out.println("endAtTime is call-back in SparetimeWorker!");return System.currentTimeMillis() + 100L;}@Overridepublic void sendDidFail() {System.out.println("SparetimeWorker send Rocket fail !");}}).isOk();if(isOk) {System.out.println("SparetimeWorker send Rocket ok !");}}}

這個類採用內部類的方式完成。

Test.java

package mark.zhang;public class Test {public static void main(String[] args) {new ProfessionalWorker().send();System.out.println("*********************************************");new SparetimeWorker().send();}}

顯示結果

endAtTime is call-back in ProfessionalWorker!startAtTime is call-back inProfessionalWorker!ProfessionalWorker send Rocket ok !*********************************************endAtTime is call-back in SparetimeWorker!startAtTime is call-back in SparetimeWorker !SparetimeWorker send Rocket fail !

這就體現 Java 中的一句話 Don't call me,I'll call you. 其含義就是回調(或者委派/委託)。

android 中很多這樣的用法,關於介面的好處還有很多,後續慢慢研究,記住一句話:物件導向面向介面編程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.