Android开发程序员我爱编程

(Kotlin and Java)设计模式-责任链模式

2018-06-04  本文已影响16人  SYfarming

以最简单的module学习设计模式,理解最重要

设计模式持续更新中:https://www.jianshu.com/p/e3c25095c31f

前言

职责链模式(Chain of Responsibility):使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Android中的事件传递机制,Okhhtp中的拦截器等都是十分好的责任链模式。
代码实现仓库: https://github.com/AnyMarvel/desigPattern

责任链模式浅析

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式的要点主要是:

1、有多个对象共同对一个任务进行处理。

2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。

3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。

3、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

责任链模式实现

我们创建抽象类 AbstractHandler,设置传递者。然后我们创建两种类型的处理器,都扩展了 AbstractHandler。每个处理器都处理自己响应的内容,如果是则相应地打印出来,否则将不打印并把消息传给下一个处理器。ClinetTest中有具体的处理方法


(使用kotlin实现,Java版本请参考仓库代码
1.定义一个抽象类AbstractHandler,实现抽象方法request
/**
 * 责任链接口
 */
abstract class AbstractHandler {
    lateinit var abstractHandler: AbstractHandler
    internal fun setSuccessor(abstractHandler: AbstractHandler) {
        this.abstractHandler = abstractHandler
    }
    abstract fun request(requestNumber: Int)
}

2.定义处理器,继承抽象方法

/**
 * 处理器Handle1
 */
class Handle1 : AbstractHandler() {
    override fun request(requestNumber: Int) {
        if (requestNumber < 10) {
            println("我是handler1,我处理了请求:$requestNumber")
        } else {
            this.abstractHandler.request(requestNumber);
        }
    }
}
/**
 * 处理器Handle2
 */
class Handle2 : AbstractHandler() {
    override fun request(requestNumber: Int) {
        if (requestNumber > 10) {
            println("我是handler2,我处理了请求:$requestNumber")
        } else {
            println("请求 $requestNumber 没人能处理")
        }
    }
}

3.测试方法

/**
 * 责任链测试类
 */
object ClientTest {
    @JvmStatic
    fun main(args: Array<String>) {
        val handle1 = Handle1()
        val handle2 = Handle2()
        handle1.setSuccessor(handle2)
        //创建任务,此处为一些数字,不同大小,处理器处理结果不同
        val testNumber = intArrayOf(4, 10, 59, 2, 16)
        for (i in testNumber.indices) {
            handle1.request(testNumber[i])
        }
    }
}

测试户结果:



如果你对此感兴趣,可订阅(感谢你的关注):


上一篇下一篇

猜你喜欢

热点阅读