retrofit使用什么设计模式,在Android中如何使用?

What design pattern retrofit uses and how does it use it in Android?

我认为Retrofit使用Facade设计模式

这绝不是一个全面的答案,但对于评论来说太长了。

我不会说它只有一个模式。你肯定可以在那里找到几个,即 Builder 用于构建改造实例。

我想可以说主要模式是 Proxy Pattern。据我所知,Retrofit 使用它来实现我们定义的 api 接口。

它为接口创建一个代理对象,每次调用方法时,它都会通过注释并构建正确的 http 请求。从我们的角度来看,感觉就像我们在调用一个实现,但它实际上是一个代理。

我想可以说它使用的拦截器是 Chain of Responsibility. However, the interceptors are part of a dependency - OkHttp - 而不是改造自身。

至于问题 "How does it use it in Android?" - 我认为与其他任何地方都没有什么不同。 Retrofit 的设计模式并不特定于 Android,并且在任何地方都一样。

Retrofit 使用了大约 12 种设计模式 :

1- 构建器模式: 将复杂对象的构造与其表示分开。

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();

2- Facade Pattern: Facade模式要求一个子系统的外部和内部通信必须通过一个统一的对象进行,这个retrofit中的统一对象就是Retrofit我们创建的对象。我们只配置Retrofit,然后获取接口对象请求数据,其他都是Retrofit框架内部的东西,我们不用管。

interface BooksApi {
    @GET("books")
    fun listBooks(): Call<List<Book>>
}

3-Proxy Pattern:用于create方法中创建接口对象,如下

public <T> T create(final Class<T> service) {
validateServiceInterface(service);
return (T)
    Proxy.newProxyInstance(
        service.getClassLoader(),
        new Class<?>[] {service},
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];

          @Override
          public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
              throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            args = args != null ? args : emptyArgs;
            return platform.isDefaultMethod(method)
                ? platform.invokeDefaultMethod(method, service, proxy, args)
                : loadServiceMethod(method).invoke(args);
          }
        });
}

4- Adapter Pattern:被CallAdapter用来将一个class的接口转换成客户端期望的另一个接口。

5-抽象工厂模式: CallAdapter.Factory是抽象工厂,CallAdapter是工厂的产品接口。

Retrofit.Builder()
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .build()

6-工厂模式:CallAdapter接口也是这个接口,它的adapt方法就是这个创建对象的方法。比如RxJava2CallAdapter的adapt方法会创建一个RxJava事件流对象,ExecutorCallAdapterFactory下的匿名内部classCallAdapter会创建一个ExecutorCallbackCall对象

7- Decorator Pattern: ExecutorCallbackCall 在改造中使用了这种模式。例如ExecutorCallbackCall 增强了OkHttpCall 的功能。 OkHttpCall 的入队方法模式是异步的。当调用子线程时,return 将在子线程中。切换到主线程。它与代理模式非常相似。

8- 策略模式: 改造 addCallAdapterFactory() 和 addConverterFactory() 用于配置策略。以addCallAdapterFactory()为例,配置的接口适配工厂对象为策略上下文Context,CallAdapter对应策略抽象,不同的接口适配器实现了CallAdapter.adapt()方法,不同的工厂会产生不同的策略实现classes,不同的策略实现了ADAPT()行为。

9- Observer Pattern: Retrofit支持的RXJAVA使用的是观察者模式,不仅如此,调用OkhttpCall对象的enqueue()方法时,使用的是回调。回调也是观察者模式。

10-原型模式: 主要用于复制一个对象。使用原型模式创建对象比直接New一个对象要好很多,因为Object的Clone()是本地方法,可以直接操作内存。原型模式的另一个好处是可以简化对象的创建,如果需要在一段代码中多次创建一个对象,不妨使用原型模式。 Prototype模式通常需要实现Cloneable接口表示复制对象。

11- Flyweight Pattern:重用已有的相似对象,如果没有找到匹配的对象,则创建新对象减少创建对象的次数减少内存,提高性能.这种设计模式属于结构模式。

12- Singleton Pattern:保证内存中只有这种class的唯一对象,属于创建模式

查看 this article and this 了解更多详情。