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

2017-03-19  本文已影响171人  gzfgeh

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,如果以后要扩展就可以在继续适配就行,非常容易扩展!!

上一篇下一篇

猜你喜欢

热点阅读