栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式-责任链模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式-责任链模式

文章目录

一、前言二、简要代码三、仿写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")
    }
}

执行结果如下:

结果:任务开始:->任务一-->任务二-->任务三-->结束
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750640.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号