java利用object实现回调委托_design principle:java 回调与委派/委托机制(转)

design principle:java 回调与委派/委托机制

博客 design principle:模拟 android Button 控件点击事件 主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现。

委派,也可以叫做委托,从字面上来理解的话,应该是委托其他类做事情而自己不做或者只做一部分工作;而回调,就是调用自己的方法。

在 java 中,这两种机制很类似,你姑且可以认为它们就是一码事。

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 }

共有三个方法,分别是用于计算 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 }

在这个类中,声明一个 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 }

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 }

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

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 }

显示结果

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 !

这就体现 Java 中的一句话 Don't call me,I'll call you. 其含义就是回调(或者委派/委托)。

android 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值