在《模擬 Android Button 控件點擊事件》(見 http://www.linuxidc.com/Linux/2011-11/46601.htm)主要說了一下模擬 Android 的 Listener 模式,其實這就是一種委派與回調機制的體現。
委派,從字面上來理解的話,應該是委托其他類做事情而自己不做或者只做一部分工作;而回調,就是調用自己的方法。
這兩種機制很類似,你姑且可以認為它們就是一碼事。
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 {
-
- @Override
- public long startAtTime() {
- System.out.println("startAtTime is call-back inProfessionalWorker!");
- return System.currentTimeMillis();
- }
-
- @Override
- public long endAtTime() {
- System.out.println("endAtTime is call-back in ProfessionalWorker!");
- return System.currentTimeMillis();
- }
-
- @Override
- public void sendDidFail() {
- System.out.println("ProfessionalWorker send Rocket fail !");
- }
-
- public void send() {
- if (new Rocket(this).isOk()) {
- System.out.println("ProfessionalWorker send Rocket ok !");
- }
- }
- }