笑谈接口回调

  接口回调是个比较抽象可是很重要的知识,大多数初学者都会在刚接触它时感受抓不住要领,但当咱们实际掌握它后,会对它爱不释手。废话很少说,让咱们开始吧。
  我认识新事物的通常有这样的习惯,就是先从事物的名称入手。那么对于接口回调这个新事物,咱们能从这个名字中获取多少信息呢?首先是接口,什么是接口呢?相信有必定编程基础的朋友都知道,就是一种规范,可是这种规范在没有实现以前,没有任何做用。就比如招聘广告同样,广告上列出的条件都是宽泛的,如我要招一名熟悉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

相关文章
相关标签/搜索