接口回调是个比较抽象可是很重要的知识,大多数初学者都会在刚接触它时感受抓不住要领,但当咱们实际掌握它后,会对它爱不释手。废话很少说,让咱们开始吧。
我认识新事物的通常有这样的习惯,就是先从事物的名称入手。那么对于接口回调这个新事物,咱们能从这个名字中获取多少信息呢?首先是接口,什么是接口呢?相信有必定编程基础的朋友都知道,就是一种规范,可是这种规范在没有实现以前,没有任何做用。就比如招聘广告同样,广告上列出的条件都是宽泛的,如我要招一名熟悉Java的程序员。这是一个规范,你想来应聘就必须知足熟悉Java这个条件,但知足这个条件的人状况可能千差万别,多是男的,也能够有女的,多是高手,也可能恰好知足这个条件。可是只要知足这个条件了,均可以来应聘,均可以称为一名应聘者。这里,招聘条件就是接口,应聘者就是实现。那么回调又怎样理解呢?回调——回来调用,回哪呢,回到定义的地方,回到实现的地方,那么这是否是间接的陈述了一个事实,就是我实现接口的地方和我调用接口的地方不是同一个地方。由此问题是否是就明了了。接口回调就是我有一个功能,可是这个功能我没有,可是有一个实体它有这个功能,我就能够经过它的功能来实现个人功能。
是否是还很晕呢?是的,那咱们接着往下。举一个例子,在文档编辑器中通常会有打印这个功能,我调用打印这个功能的时候,假如不给它提供一台可正常工做的打印机时,它是没有办法工做的。可是当咱们接上打印机后,再执行打印这个功能,打印内容出如今了打印机的出口,打印功能完成。但是若是我没有在文档编辑器中调用这个打印功能呢,是否是就不会有打印结果产生了,这是否是很神奇。这就是接口回调的魅力,功能我有可是真正作事的不是我,可是你想作事又不能没有我。
那么这样作有什么意义呢?再举个例子,如我须要粉刷房子,可是我本身又不会粉刷,那么怎么办呢?确定得找人来粉刷啊,而不是由粉刷工人来问我是否是须要粉刷房子。由于粉刷的时间是不肯定的,不可能每时每刻都有粉刷需求。在咱们根据各类状况判断后,在合适的时间,咱们再请粉刷工人来完成咱们的粉刷任务。在咱们不须要粉刷的时候,粉刷工人能够为其余人服务,这样提升了粉刷工人的工做效率,又不至于影响个人粉刷任务。因此接口回调的意义就很明确了,由我来指挥我要作什么事,可是我不作事,咱们由执行者的身份转换为了指挥者,这样便于组织咱们的功能,又不会浪费一大把的宝贵资源。
说了老半天,那么咱们应该怎样来实现接口回调呢?以上面的粉刷房子为例,我写了一个小的测试程序。程序员
1 package andy.example; 2 3 public interface Paint { 4 //粉刷任务 5 void paint(); 6 }
在这里,咱们定义了一个接口,该接口里只有一个粉刷的方法。编程
1 package andy.example; 2 3 //工人实体,具备粉刷功能 4 public class Worker implements Paint{ 5 6 @Override 7 public void paint() { 8 System.out.println("我是一名粉刷匠,粉刷本领强!"); 9 } 10 11 }
真正具备粉刷功能的粉刷工人。编辑器
1 package andy.example; 2 3 //可能须要粉刷房子的实体 4 public class Asker { 5 6 // 是否须要粉刷 7 private boolean isNeedPaint; 8 9 public void setIsNeedPaint(boolean isNeedPaint) { 10 this.isNeedPaint = isNeedPaint; 11 } 12 13 /** 14 * 指挥粉刷 15 * 16 * @param worker 17 * 粉刷工人 18 */ 19 public void doPaint(Paint paint) { 20 if (isNeedPaint) { 21 paint.paint(); 22 } else { 23 System.out.println("房子不须要粉刷,你特么逗我呢!"); 24 } 25 } 26 }
可能须要粉刷的人。ide
1 package andy.example; 2 3 //测试类 4 public class Test { 5 6 public static void main(String[] args) { 7 //有两个请求者 8 Asker asker1=new Asker(); 9 Asker asker2=new Asker(); 10 11 //第二个真正须要粉刷 12 asker2.setIsNeedPaint(true); 13 14 //同一个粉刷工人 15 Worker worker=new Worker(); 16 17 System.out.println("不须要粉刷房子的请求者,调用粉刷方法后"); 18 asker1.doPaint(worker); 19 System.out.println("须要粉刷房子的请求者,调用粉刷方法后"); 20 asker2.doPaint(worker); 21 } 22 23 }
测试类。测试
毫无疑问的结果。this
简单分析:须要粉刷的人根据状况判断房子是否须要粉刷,在不须要粉刷的时候调用粉刷功能是无效的,如结果一,真正须要粉刷的人,在合适的时候调用粉刷方法,完成粉刷工做。spa