前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-责任链模式

设计模式-责任链模式

作者头像
Anymarvel
发布2018-10-22 11:09:53
3910
发布2018-10-22 11:09:53
举报
文章被收录于专栏:Android开发实战Android开发实战

15

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

前言

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

Android中的事件传递机制,Okhhtp中的拦截器等都是十分好的责任链模式。

代码实现仓库: https://github.com/AnyMarvel/desigPattern

责任链模式浅析

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

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

  1. 有多个对象共同对一个任务进行处理。
  2. 这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
  3. 一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
  4. 客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

责任链模式实现

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

(使用kotlin实现,Java版本请参考仓库代码) 1.定义一个抽象类AbstractHandler,实现抽象方法request

代码语言:javascript
复制
/**
 * 责任链接口
 */abstract class AbstractHandler {
    lateinit var abstractHandler: AbstractHandler
    internal fun setSuccessor(abstractHandler: AbstractHandler) {        this.abstractHandler = abstractHandler
    }    abstract fun request(requestNumber: Int)}

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

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

3.测试方法

代码语言:javascript
复制
/**
 * 责任链测试类
 */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])
        }
    }
}

测试户结果:

观察者模式请跳转:https://www.jianshu.com/p/77318ec05fb1

持续更新中

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android历练记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档