Java学习day8——接口与代理设计模式实现数据回调

2020.3.25

学习目的:掌握接口的概念及使用方式,并理解代理设计模式

1.接口

接口:一套协议,一套行为规范,是多个类共同的公共行为规范,这些行为是与外部交流的通道,接口可以降低类和类之间的耦合性

以USB接口为例

USB接口.png

只需要统一USB接口,各种电脑都可使用其功能
使用interface关键字表示定义一个接口
一个类可以实现多个接口,各接口间用逗号隔开

接口内部可以有以下元素:

  1. 没有构造方法->不能实例化对象
  2. 定义变量:只能是静态成员变量,因为没有对象,无法调用普通成员变量
    默认的修饰符->public static final
    由于默认为静态属性,所以很多时候就用接口代替枚举
  3. 抽象方法:不需要自己实现,谁用谁就实现
    默认的修饰符->public abstract
    使用implements实现接口,必须实现接口里面定义的方法
  4. 内部接口->接口内部还可以定义接口,相当于内部接口成了外部接口的一个属性
package day6;
//用这种方法代替枚举
interface Season{
    int SPRING=1;
    int SUMMER=2;
    int AUTUMN=3;
    int WINTER=4;
}
public interface DataInteraction {
    interface Input{
        void input();
    }
    interface Output{
        void output();
    }
}
----------------------------------------------------------------------------------------
package day6;
//苹果电脑 需要和外部进行数据交互 必须实现数据交互的接口
public class Macbook implements DataInteraction.Input,DataInteraction.Output{
    @Override
    public void input() {
        System.out.println("输入数据");
    }
    @Override
    public void output() {
        System.out.println("输出数据");
    }
}

2.代理模式->利用接口实现数据回调

将数据下载的功能用一个功能类进行封装,下载完毕的数据就是通过功能类内部的接口来返回给需要该数据的对象

原理图如下

接口实现数据回调.png

package day6.callBack;
public class Http {
    //2.定义一个变量接收谁来监听网络下载完毕的事件
    private OnFinishListener listener;
     public void getData(String url){
         System.out.println("开始下载数据...");
         System.out.println("下载完毕...");
         if(listener!=null){
             //3.任务结束,回调数据
             listener.Success("您需要的图片已下载完毕!");
         }
     }
     //1.定义一个接口,统一返回数据的方式
     public interface OnFinishListener{
         void Success(String img);
         void Failure(String err);
     }
      //4.提供set方法保存当前的监听者
    public void setListener(OnFinishListener listener) {
        this.listener = listener;
    }
}
----------------------------------------------------------------------------------------
package day6.callBack;
//5.使用者必须实现这个接口
public class SplashView implements Http.OnFinishListener{
   public SplashView(){
       //开始下载数据
       Http http=new Http();
       //7.必须传递当前对象给功能类,才知道监听者是谁
       http.setListener(this);
       //8.调用功能类,完成功能
       http.getData("www.baidu.com");
   }
   //6.必须实现接口内部的所有抽象方法
    @Override
    public void Success(String img) {
        System.out.println(img);
    }
    @Override
    public void Failure(String err) {
        System.out.println("图片下载失败!");
    }
}
----------------------------------------------------------------------------------------
package day6.callBack;
public class MyClass {
    public static void main(String[] args) {
        SplashView view=new SplashView();
    }
}
//        输出结果:
//        开始下载数据...
//        下载完毕...
//        您需要的图片已下载完毕!

小结:
   1.接口相当于是Http和SplashView之间的一个桥梁,也是传递下载完毕的数据的一个通道
   2.监听者即需要该数据的对象贯穿整个下载过程,由于该对象的类实现了接口,就相当于继承,所以在设置监听者的时候用接口对象来接收该类的对象(子类对象可以转向父类对象即使用多态),该过程统一了监听者,倘若不使用接口,并且有多个页面类需要下载数据,那么在功能类中需要定义多个需要数据的对象作为监听者,并且在回调数据的时候也需要调用各个页面类独有的回调方法,即每多一个类,就多一个成员变量,多一个set方法,还多一次调用回调数据的方法,并且使用者也需要自己定义一个回调数据的方法,对于双方都很麻烦,这就是使用接口的好处
   3.正是由于接口定义了一套规范,所以使用者不用去考虑太多的事情,直接实现它并使用就可以
   4.其实你不用记什么接口实现数据回调,只需要理解到它的本质就是一个代理者模式,简而言之就是使用者实现执行者内部的一个接口,并实现里面的抽象方法,返回给使用者数据

你可能感兴趣的:(Java学习day8——接口与代理设计模式实现数据回调)