MST

星途 面试题库

面试题:Kotlin的OkHttp拦截器链中的责任链模式优化

在Kotlin的OkHttp拦截器链中,责任链模式是核心。假设已有一个复杂的拦截器链,某些拦截器之间存在重复逻辑,你如何运用责任链模式的特性进行优化,减少代码冗余,提高可维护性?请详细说明思路并给出关键代码片段。
20.9万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 提取重复逻辑:将拦截器之间的重复逻辑提取出来,封装成一个独立的方法或类。
  2. 抽象拦截器:创建一个抽象的拦截器类,将重复逻辑放在抽象类中,让具体的拦截器继承这个抽象类,从而复用这些逻辑。
  3. 责任链构建:按照责任链模式的规则,在拦截器链中依次调用各个拦截器,每个拦截器在处理请求时,可以先调用抽象类中的重复逻辑,然后再执行自己特有的逻辑。

关键代码片段

  1. 抽象拦截器类
abstract class BaseInterceptor : Interceptor {
    // 提取的重复逻辑
    protected fun commonLogic(request: Request): Request {
        // 例如添加通用的请求头
        return request.newBuilder()
           .addHeader("Common-Header", "Value")
           .build()
    }

    override fun intercept(chain: Interceptor.Chain): Response {
        val newRequest = commonLogic(chain.request())
        return onIntercept(chain, newRequest)
    }

    protected abstract fun onIntercept(chain: Interceptor.Chain, request: Request): Response
}
  1. 具体拦截器
class SpecificInterceptor1 : BaseInterceptor() {
    override fun onIntercept(chain: Interceptor.Chain, request: Request): Response {
        // 自己特有的逻辑
        val modifiedRequest = request.newBuilder()
           .addHeader("Specific1-Header", "Value1")
           .build()
        return chain.proceed(modifiedRequest)
    }
}

class SpecificInterceptor2 : BaseInterceptor() {
    override fun onIntercept(chain: Interceptor.Chain, request: Request): Response {
        // 自己特有的逻辑
        val modifiedRequest = request.newBuilder()
           .addHeader("Specific2-Header", "Value2")
           .build()
        return chain.proceed(modifiedRequest)
    }
}
  1. 构建OkHttp客户端与责任链
val client = OkHttpClient.Builder()
   .addInterceptor(SpecificInterceptor1())
   .addInterceptor(SpecificInterceptor2())
   .build()