部落格好久沒有更新,自己也好久沒有寫代碼了。
慚愧!最近諸事不順,算了,不說廢話了,呵呵!
部落格 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 中很多這樣的用法,關於介面的好處還有很多,後續慢慢研究,記住一句話:物件導向面向介面編程。