java 回调与委派/委托机制

该例子是这样的(只是一个例子):


ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派(或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。


总之,Rocket不做具体的事情。看实例代码:


IRocketDelegate.java源码


  1. package mark.zhang;  
  2.   
  3. public interface IRocketDelegate {  
  4.       
  5.     public abstract long startAtTime();  
  6.       
  7.     public abstract long endAtTime();  
  8.       
  9.     public abstract void sendDidFail();  
  10. }  
package mark.zhang;

public interface IRocketDelegate {
	
	public abstract long startAtTime();
	
	public abstract long endAtTime();
	
	public abstract void sendDidFail();
}

共有三个方法,分别是用于计算 Rocket 发射时间、计算 Rocket 发射完毕的时间以及发送是否失败的。


Rocket.java源码


  1. package mark.zhang;  
  2.   
  3. public class Rocket {  
  4.   
  5.     IRocketDelegate delegate = null;  
  6.   
  7.     public Rocket(IRocketDelegate delegate) {  
  8.         this.delegate = delegate;  
  9.     }  
  10.   
  11.     private long getRocketStartTime() {  
  12.         long startTime = delegate.startAtTime();  
  13.         return startTime;  
  14.     }  
  15.   
  16.     private long getRocketEndTime() {  
  17.         long endTime = delegate.endAtTime();  
  18.         return endTime;  
  19.     }  
  20.   
  21.     public boolean isOk() {  
  22.         // 超时0.1秒为失败  
  23.         if (getRocketEndTime() - getRocketStartTime() >= 100) {  
  24.             delegate.sendDidFail();  
  25.             return false;  
  26.         }  
  27.         return true;  
  28.     }  
  29.   
  30. }  
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源码


  1. package mark.zhang;  
  2.   
  3. public class ProfessionalWorker implements IRocketDelegate {  
  4.   
  5.     @Override  
  6.     public long startAtTime() {  
  7.         System.out.println("startAtTime is call-back inProfessionalWorker!");  
  8.         return System.currentTimeMillis();  
  9.     }  
  10.   
  11.     @Override  
  12.     public long endAtTime() {  
  13.         System.out.println("endAtTime is call-back in ProfessionalWorker!");  
  14.         return System.currentTimeMillis();  
  15.     }  
  16.   
  17.     @Override  
  18.     public void sendDidFail() {  
  19.         System.out.println("ProfessionalWorker send Rocket fail !");  
  20.     }  
  21.   
  22.     public void send() {  
  23.         if (new Rocket(this).isOk()) {  
  24.             System.out.println("ProfessionalWorker send Rocket ok !");  
  25.         }  
  26.     }  
  27. }  
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 !");
		}
	}
}

SparetimeWorker.java源码


  1. package mark.zhang;  
  2.   
  3. public class SparetimeWorker {  
  4.     public void send() {  
  5.         boolean isOk = new Rocket(new IRocketDelegate() {  
  6.               
  7.             @Override  
  8.             public long startAtTime() {  
  9.                 System.out.println("startAtTime is call-back in SparetimeWorker !");  
  10.                 return System.currentTimeMillis();  
  11.             }  
  12.   
  13.             @Override  
  14.             public long endAtTime() {  
  15.                 System.out.println("endAtTime is call-back in SparetimeWorker!");  
  16.                 return System.currentTimeMillis() + 100L;  
  17.             }  
  18.   
  19.             @Override  
  20.             public void sendDidFail() {  
  21.                 System.out.println("SparetimeWorker send Rocket fail !");  
  22.             }  
  23.         }).isOk();  
  24.           
  25.         if(isOk) {  
  26.             System.out.println("SparetimeWorker send Rocket ok !");  
  27.         }  
  28.     }  
  29. }  
package mark.zhang;

public class SparetimeWorker {
	public void send() {
		boolean isOk = new Rocket(new IRocketDelegate() {
			
			@Override
			public long startAtTime() {
				System.out.println("startAtTime is call-back in SparetimeWorker !");
				return System.currentTimeMillis();
			}

			@Override
			public long endAtTime() {
				System.out.println("endAtTime is call-back in SparetimeWorker!");
				return System.currentTimeMillis() + 100L;
			}

			@Override
			public void sendDidFail() {
				System.out.println("SparetimeWorker send Rocket fail !");
			}
		}).isOk();
		
		if(isOk) {
			System.out.println("SparetimeWorker send Rocket ok !");
		}
	}
}

这个类采用内部类的方式完成。


Test.java


  1. package mark.zhang;  
  2.   
  3. public class Test {  
  4.   
  5.     public static void main(String[] args) {  
  6.         new ProfessionalWorker().send();  
  7.           
  8.         System.out.println("*********************************************");  
  9.           
  10.         new SparetimeWorker().send();  
  11.     }  
  12. }  
package mark.zhang;

public class Test {

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

显示结果


  1. endAtTime is call-back in ProfessionalWorker!  
  2. startAtTime is call-back inProfessionalWorker!  
  3. ProfessionalWorker send Rocket ok !  
  4. *********************************************  
  5. endAtTime is call-back in SparetimeWorker!  
  6. startAtTime is call-back in SparetimeWorker !  
  7. SparetimeWorker send Rocket fail !  
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 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值