设计模式之责任链模式

责任链模式含义

在阅读OkHttp源码的过程中,我发现他在处理拦截器的过程中非常巧妙,结合了责任链模式,将Request以链路的方式传递下去,再将Response以方向链路传递上去。

责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

实例

通过模仿OkHttp写一个责任链模式,处理请求和响应。
假设一个Request请求,需要经过Log、Header、Connect和Call四个流程,每个流程都会单独对Request进行处理,最终从流程的末端获取Response。
在这里插入图片描述
具体流程如上图所以,Chain作为链条,驱动着Request请求的开始,同时也是最终拿到Response的对象。

  • 实线部分为完整的一个责任链流程,Chain发起,经过Logger->Header->Connect->Call,等到Call处理完结果,再将结果方向传递上去,依次经过Call->Connect->Header->Logger->Chain。
  • 虚线部分为中途被某一个对象提前消费返回,比如在Header步骤出现异常,生成一个空的Response返回,那么请求流程就变为Chain->Logger->Header,返回流程则为Header->Logger->Chain;这就是责任链模式的魅力,链中任何一个对象都可以提前消费并返回,而且不影响链路的正常执行。

代码

定义Chain、Request和Response

/**
 * [Chain]对象用来发起请求,并且接收最终的结果
 */
class Chain(private val interceptorList: List<Interceptor>, private val index: Int, val request: Request) {
   

    /**
     * 依次调用链对象处理方法
     */
    fun process(request: Request): Response {
   
        // 同样使用index作为下标,用来依次调用链中对象
        val next = Chain(interceptorList, index = this.index + 1, request)
        val interceptor = interceptorList[index]
        return interceptor.intercept(next)
    }
}

/**
 * [Request]
 */
class Request(var msg: String) {
   

    fun buildRequest(msg: String) = Request(msg)
}

/**
 * [Response]
 */
class Response(val msg: String) {
   
    fun buildResponse(msg: String) = Response(msg)
}

定义Interceptor基类和四个链对象

/**
 * [Interceptor]对象用来处理链中对象的逻辑
 */
interface Interceptor {
   

    fun intercept(chain: Chain): Response
}

class LoggerInterceptor : Interceptor {
   
    override fun intercept(chain: Chain): Response {
   
        val request = chain.request
        println("logger request: ${
     request.msg}")
        val response = chain.process(request.buildRequest("logger"))
        println("logger response: 
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值