美文网首页
Retrofit的设计模式 -- 适配器模式

Retrofit的设计模式 -- 适配器模式

作者: gzfgeh | 来源:发表于2017-03-19 16:04 被阅读171次

Retrofit中的适配器模式

看过Retrofit源码的都知道,CallAdapter部分是项目中不好理解的地方,但是也是代码中最精彩的部分,就这一个地方就包含了适配模式、策略模式、代理模式等,下面先看看其中的适配器模式。
Retrofit是网络请求操作的封装底层还是Okhttp请求,其中Retrofit中网络请求接口Call是和Okhttp连接的地方

public interface Call<T> extends Cloneable {
  Response<T> execute() throws IOException;
  void enqueue(Callback<T> callback);
  boolean isExecuted();
  void cancel();
  boolean isCanceled();
  Call<T> clone();
  Request request();
}

Retrofit中有默认的实现OkhttpCall,大家都知道网络请求需要切换线程的,但是现在客户端操作(就是用Retrofit的程序员)结合了RxJava,怎么把OKhttpCall的操作方式转换成RxJava切换线程的方式呢?现在想在Android平台上面用,怎么把OkhttpCall的操作方式转换成Android平台下Handler切换线程的方式呢?如果以后还想扩展其他平台呢?那么用了Adapter适配器模式可以很好的解决这个问题!
1、如果用了RxJava那么就会使用RxJavaCallAdapterFactory,这个里面是怎么转换线程的呢(RxJavaCallAdapterFactory本身内部getCallAdapter中用到了策略模式),可以看到里面的SimpleCallAdapter内部类有一个adapt方法就是把OkhttpCall的方式转换成RxJava的方式.

QQ20170319-0@2x.png
2、如果在Android默认平台下就会使用ExecutorCallAdapterFactory,这个里面用到了Handler来切换线程,首先内部类ExecutorCallbackCall(本身自己就是静态代理模式)中实现了切换线程,ExecutorCallbackCall中的callbackExecutor就是
static class MainThreadExecutor implements Executor {
      private final Handler handler = new Handler(Looper.getMainLooper());

      @Override public void execute(Runnable r) {
        handler.post(r);
      }
    }

3、如果是Java8平台那么就会使用Java8CallAdapterFactory,这个里面就会使用CompletableFuture来切换线程.

@Override public CompletableFuture<R> adapt(final Call<R> call) {
      final CompletableFuture<R> future = new CompletableFuture<R>() {
        @Override public boolean cancel(boolean mayInterruptIfRunning) {
          if (mayInterruptIfRunning) {
            call.cancel();
          }
          return super.cancel(mayInterruptIfRunning);
        }
      };

      call.enqueue(new Callback<R>() {
        @Override public void onResponse(Call<R> call, Response<R> response) {
          if (response.isSuccessful()) {
            future.complete(response.body());
          } else {
            future.completeExceptionally(new HttpException(response));
          }
        }

        @Override public void onFailure(Call<R> call, Throwable t) {
          future.completeExceptionally(t);
        }
      });

      return future;
    }
  }

总结:Retrofit中用了适配器模式把OkHttpCall轻松适配到了RxJava的Observable、Android的ExecutorCallbackCall、Java8的CompletableFuture,当然还有一个Guava,如果以后要扩展就可以在继续适配就行,非常容易扩展!!

相关文章

  • Retrofit

    Retrofit设计模式 动态代理,装饰模式,建造者模式,抽象工厂模式,适配器模式 建造者模式创建Retrofit...

  • Retrofit源码设计模式解析(下)

    本文将接着《Retrofit源码设计模式解析(上)》,继续分享以下设计模式在Retrofit中的应用: 适配器模式...

  • Retrofit的使用之设计模式

    使用的设计模式有: 动态代理 门面模式 适配器模式创建流程创建流程 创建Retrofit 首先构造retrofit...

  • 简说设计模式之适配器模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是适配器模式 适配器模式(Adapter...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • Retrofit的设计模式 -- 适配器模式

    Retrofit中的适配器模式 看过Retrofit源码的都知道,CallAdapter部分是项目中不好理解的地方...

  • iOS设计模式(5)策略模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(6)模板模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(7)建造者模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

网友评论

      本文标题:Retrofit的设计模式 -- 适配器模式

      本文链接:https://www.haomeiwen.com/subject/lfnmnttx.html