版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mingyunxiaohai/article/details/91358243
适配器模式是将一个类的接口转换成开发者希望的另一个接口
下面参考Retrofit的源码学习适配器模式,Retrofit现在的Andorid开发者基本都用到过,里面用到了很多设计模式比如动态代理模式,适配器模式等。下面来看其中的一个适配器
在使用Retrofit的时候我们经常会看到下面的写法来添加一个addCallAdapterFactory,如果我们不添加,会有自己的一个CallAdapter返回一个Call对象,如果我们想和RxJava结合使用只需要添加一个RxJava的CallAdapter即可。
Retrofit retrofit = new Retrofit.Builder() .baseUrl("") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); // Retrofit的create方法源码 public <T> T create(final Class<T> service) { ...... return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service }, new InvocationHandler() { private final Platform platform = Platform.get(); @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args) throws Throwable { ...... ServiceMethod<Object, Object> serviceMethod = (ServiceMethod<Object, Object>) loadServiceMethod(method); OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args); return serviceMethod.adapt(okHttpCall); } }); }
下面开始仿照Retrofit写一下适配器模式
首先有一个Call接口和CallAdapter适配器和一个Call的实现类OkHttpCall,CallAdapter中有一个抽象工厂类里面有个get()方法可以返回自己。
public interface Call<T> { void enqueue(); } public interface CallAdapter<R,T> { T adapt(Call<R> call); abstract class Factory{ public abstract CallAdapter<?,?> get(); } } public class OkHttpCall<T> implements Call<T> { @Override public void enqueue() { //请求网络 } }
实现一个默认的 CallAdapter
public class ExecutorCallAdapterFactory extends CallAdapter.Factory { @Override public CallAdapter<?, ?> get() { return new CallAdapter<Object, Call<?>>() { @Override public Call<?> adapt(Call<Object> call) { System.out.println("default 方式"); return new ExectorCallbackCall<>(); } }; } static final class ExectorCallbackCall<T> implements Call<T>{ @Override public void enqueue() { } } }
在实现一个RxJava的CallAdapter
public class RxJavaCallAdapterFactory extends CallAdapter.Factory { @Override public CallAdapter<?, ?> get() { return new CallAdapter<Object, Observable<?>>() { @Override public Observable<?> adapt(Call<Object> call) { System.out.println("rxjava 方式"); ObservableOnSubscribe subscribe = new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { } }; return Observable.create(subscribe); } }; } }
Retrofit类中调用
public class Retrofit { private CallAdapter.Factory mFactory; private Retrofit(CallAdapter.Factory factory) { mFactory = factory; } public CallAdapter callAdapter(){ return mFactory.get(); } public <T> T create(){ ServiceMethod serviceMethod = new ServiceMethod.Builder<>(this).build(); OkHttpCall okHttpCall = new OkHttpCall(); return (T) serviceMethod.adapt(okHttpCall); } public static final class Builder{ CallAdapter.Factory mFactory; public Builder addCallAdapterFactory(CallAdapter.Factory factory){ mFactory = factory; return this; } public Retrofit build(){ if(mFactory == null){ return new Retrofit(new ExecutorCallAdapterFactory()); } return new Retrofit(mFactory); } } }
通过ServiceMethod把Retrofit和CallAdapter连起来
public class ServiceMethod<R,T> { private CallAdapter<R,T> mCallAdapter; private <R, T> ServiceMethod(Builder builder) { mCallAdapter = builder.mCallAdapter; } T adapt(Call<R> call){ return mCallAdapter.adapt(call); }; static final class Builder<R,T>{ Retrofit mRetrofit; CallAdapter<R,T> mCallAdapter; public Builder(Retrofit retrofit) { mRetrofit = retrofit; } public ServiceMethod build(){ mCallAdapter = createCallAdapter(); return new ServiceMethod(this); } private CallAdapter<R, T> createCallAdapter() { return mRetrofit.callAdapter(); } } }
最后调用:
Retrofit retrofit = new Retrofit.Builder() .addCallAdapterFactory(new RxJavaCallAdapterFactory()) .build(); retrofit.create();
如果不加addCallAdapterFactory运行输出:“default 方式”
如果添加了运行输出:“rxjava 方式”
适配器模式完成。