【设计模式】责任链模式

361 阅读3分钟

责任链模式

责任链模式是一种行为型设计模式,它允许多个对象以链式的方式处理请求,直到其中一个对象能够处理该请求为止。每个对象都有机会处理请求,但是请求最终只会被处理一次。

组成

责任链模式由以下几个组成部分:

  • Handler:处理请求的接口,通常包含一个指向下一个处理者的引用。
  • ConcreteHandler:实现 Handler 接口的具体处理者,能够处理它所负责的请求,否则将该请求传递给下一个处理者。
  • Client:创建请求并将其发送到第一个处理者。

类图

image.png

使用场景

  • 当需要将请求从一个对象传递到另一个对象时,而不知道哪个对象能够处理该请求时,可以使用责任链模式。
  • 当需要动态地指定可以处理请求的对象时,可以使用责任链模式。

Android 中的责任链模式

Retrofit 是一个广泛使用责任链模式的 Android 库。Retrofit 允许开发人员定义多个拦截器来处理 HTTP 请求和响应。每个拦截器都有机会处理请求或响应,否则将请求或响应传递给下一个拦截器。

下面是 Retrofit 的拦截器接口:

interface Interceptor {
  fun intercept(chain: Interceptor.Chain): Response
  interface Chain {
    fun request(): Request
    fun proceed(request: Request): Response
  }
}

在该接口中,Interceptor 表示处理请求或响应的拦截器,而 Chain 表示一个拦截器链。每个拦截器都必须实现 Interceptor 接口,并将请求传递给 Chain.proceed(request) 方法,以便让下一个拦截器继续处理请求。如果没有下一个拦截器,则 Chain.proceed(request) 方法将返回最终的响应。

以下是使用 Retrofit 的代码示例:

val retrofit = Retrofit.Builder()
  .baseUrl("https://example.com")
  .addInterceptor(Interceptor { chain ->
    val request = chain.request()
    // 处理请求...
    val response = chain.proceed(request)
    // 处理响应...
    response
  })
  .build()

在该示例中,我们创建了一个 Retrofit 实例,并向其添加了一个拦截器。该拦截器使用 Interceptor 接口来处理请求和响应,并将其传递给下一个拦截器。由于我们只添加了一个拦截器,因此请求和响应最终将由该拦截器处理。

当然在源码中,也有涉及到有关的责任链模式。例如:

  • View 事件分发机制:在 Android 中,View 事件分发机制允许多个 View 对象以链式的方式处理触摸事件。该机制允许用户在应用程序中交互,并允许多个 View 对象以链式的方式处理事件,直到其中一个 View 对象处理该事件为止。

  • BroadcastReceiver 消息分发机制:在 Android 中,BroadcastReceiver 允许多个组件以链式的方式处理广播消息。该机制允许多个组件以不同的优先级接收广播消息,并且只有优先级最高的组件能够处理该消息。

总结

责任链模式是一种常见的设计模式,它允许多个对象以链式的方式处理请求,直到其中一个对象能够处理该请求为