在《模拟 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 !");
- }
- }
- }