Retrofit的設(shè)計(jì)模式 -- 適配器模式

Retrofit中的適配器模式

看過(guò)Retrofit源碼的都知道,CallAdapter部分是項(xiàng)目中不好理解的地方,但是也是代碼中最精彩的部分,就這一個(gè)地方就包含了適配模式、策略模式、代理模式等,下面先看看其中的適配器模式。
Retrofit是網(wǎng)絡(luò)請(qǐng)求操作的封裝底層還是Okhttp請(qǐng)求,其中Retrofit中網(wǎng)絡(luò)請(qǐng)求接口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中有默認(rèn)的實(shí)現(xiàn)OkhttpCall,大家都知道網(wǎng)絡(luò)請(qǐng)求需要切換線程的,但是現(xiàn)在客戶端操作(就是用Retrofit的程序員)結(jié)合了RxJava,怎么把OKhttpCall的操作方式轉(zhuǎn)換成RxJava切換線程的方式呢?現(xiàn)在想在Android平臺(tái)上面用,怎么把OkhttpCall的操作方式轉(zhuǎn)換成Android平臺(tái)下Handler切換線程的方式呢?如果以后還想擴(kuò)展其他平臺(tái)呢?那么用了Adapter適配器模式可以很好的解決這個(gè)問(wèn)題!
1、如果用了RxJava那么就會(huì)使用RxJavaCallAdapterFactory,這個(gè)里面是怎么轉(zhuǎn)換線程的呢(RxJavaCallAdapterFactory本身內(nèi)部getCallAdapter中用到了策略模式),可以看到里面的SimpleCallAdapter內(nèi)部類有一個(gè)adapt方法就是把OkhttpCall的方式轉(zhuǎn)換成RxJava的方式.

QQ20170319-0@2x.png

2、如果在Android默認(rèn)平臺(tái)下就會(huì)使用ExecutorCallAdapterFactory,這個(gè)里面用到了Handler來(lái)切換線程,首先內(nèi)部類ExecutorCallbackCall(本身自己就是靜態(tài)代理模式)中實(shí)現(xiàn)了切換線程,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平臺(tái)那么就會(huì)使用Java8CallAdapterFactory,這個(gè)里面就會(huì)使用CompletableFuture來(lái)切換線程.

@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;
    }
  }

總結(jié):Retrofit中用了適配器模式把OkHttpCall輕松適配到了RxJava的Observable、Android的ExecutorCallbackCall、Java8的CompletableFuture,當(dāng)然還有一個(gè)Guava,如果以后要擴(kuò)展就可以在繼續(xù)適配就行,非常容易擴(kuò)展??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容