一、前言二、简要代码三、仿写okhttp责任链写法
一、前言 责任链模式是设计模式中的一种,Android的事件分发机制就有点像责任链模式,OkHttp中的拦截器也是责任链模式。本篇是为了对后文的okhttp原理进行铺垫
二、简要代码 假设我们要实现一个功能,中间要经过A、B、C三个步骤。每个步骤之间进行隔离。简要代码如下:
abstract class Interceptor {
var next: Interceptor ?= null
abstract fun intercept(result: String)
}
class Interceptor1: Interceptor() {
override fun intercept(result: String) {
val append = result + "任务一-->"
next?.intercept(append)
}
}
class Interceptor2: Interceptor() {
override fun intercept(result: String) {
val append = result + "任务二-->"
next?.intercept(append)
}
}
class Interceptor3: Interceptor() {
override fun intercept(result: String) {
val append = result + "任务三-->结束"
println("最终结果:$append")
next?.intercept(append)
}
}
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
val interceptor1 = Interceptor1()
val interceptor2 = Interceptor2()
val interceptor3 = Interceptor3()
interceptor1.next = interceptor2
interceptor2.next = interceptor3
interceptor1.intercept("任务开始-->")
}
}
执行结果:
最终结果:任务开始-->任务一-->任务二-->任务三-->结束三、仿写okhttp责任链写法
在Okhttp中对于拦截器的使用不是上面那样每次都用next进行赋值的。这里对其进行改写如下:
abstract class Interceptor {
abstract fun intercept(chain: Chain): String
}
class Interceptor1: Interceptor() {
override fun intercept(chain: Chain): String {
val append = chain.getCurrentResult() + "任务一-->"
return chain.proceed(append)
}
}
class Interceptor2: Interceptor() {
override fun intercept(chain: Chain): String {
val append = chain.getCurrentResult() + "任务二-->"
return chain.proceed(append)
}
}
class Interceptor3: Interceptor() {
override fun intercept(chain: Chain): String {
return chain.getCurrentResult() + "任务三-->结束"
}
}
class Chain(private val result: String,
private val index: Int = 0,
private val interceptorList:MutableList
) {
fun getCurrentResult(): String = result
fun proceed(result: String): String{
val next = copy(result,index + 1)
val currentInterceptor = interceptorList[index]
return currentInterceptor.intercept(next)
}
private fun copy(result: String, index: Int): Chain = Chain(result,index, interceptorList)
}
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
val interceptor1 = Interceptor1()
val interceptor2 = Interceptor2()
val interceptor3 = Interceptor3()
val interceptorList = mutableListOf(interceptor1,interceptor2,interceptor3)
val source = "任务开始:->"
val chain = Chain(source,0,interceptorList)
val result = chain.proceed(source)
println("结果:$result")
}
}
执行结果如下:
结果:任务开始:->任务一-->任务二-->任务三-->结束



