当前位置: 首页 > article >正文

kotlin——设计模式之责任链模式

目录

 

介绍

应用场景

总结


介绍

责任链模式是一种行为设计模式,它允许将请求从一个对象传递到另一个对象,直到请求被处理为止。在责任链模式中,每个对象都有机会处理请求,但它们也可以选择将请求传递给下一个处理者。

使用责任链模式的场景包括:

  • 当有多个对象可以处理同一个请求时,但只有其中一个对象需要处理请求。
  • 当需要动态指定处理请求的对象。
  • 当需要按照一定顺序处理多个请求。

应用场景

点击按钮然后实现:校验数据是否正确,处理数据,记录到本地,发送请求。

示例代码: 

// 定义一个处理器接口
    interface ClickChain {
        fun setNext(handler: ClickChain): ClickChain
        fun handle(request: Request): Boolean
    }

    // 请求类
    data class Request(var data: String, var isValid: Boolean = false)

    // 校验数据的处理器
    class ValidationChain : ClickChain {
        private var nextHandler: ClickChain? = null

        override fun setNext(handler: ClickChain): ClickChain {
            nextHandler = handler
            return handler
        }

        override fun handle(request: Request): Boolean {
            // 校验数据
            request.isValid = request.data != ""
            if (!request.isValid) {
                println("数据校验失败")
                return false
            }
            println("数据校验通过")
            return nextHandler?.handle(request) ?: true
        }
    }

    // 处理数据的处理器
    class ProcessingChain : ClickChain {
        private var nextHandler: ClickChain? = null

        override fun setNext(handler: ClickChain): ClickChain {
            nextHandler = handler
            return handler
        }

        override fun handle(request: Request): Boolean {
            // 处理数据
            request.data = request.data.trim().uppercase()
            println("数据处理完成: ${request.data}")
            return nextHandler?.handle(request) ?: true
        }
    }

    // 记录到本地的处理器
    class LocalStorageChain : ClickChain {
        private var nextHandler: ClickChain? = null

        override fun setNext(handler: ClickChain): ClickChain {
            nextHandler = handler
            return handler
        }

        override fun handle(request: Request): Boolean {
            // 记录到本地
            println("数据已记录到本地: ${request.data}")
            return nextHandler?.handle(request) ?: true
        }
    }

    // 发送请求的处理器
    class NetworkRequestChain : ClickChain {
        override fun setNext(handler: ClickChain): ClickChain {
            throw UnsupportedOperationException("最后的处理器不支持设置下一个处理器")
        }

        override fun handle(request: Request): Boolean {
            // 发送网络请求
            println("发送网络请求: ${request.data}")
            return true
        }
    }

    // 主函数,模拟按钮点击处理
    fun main() {
        // 创建责任链
        val validationC = ValidationChain()
        val processingC = ProcessingChain()
        val localStorageC = LocalStorageChain()
        val networkRequestC = NetworkRequestChain()
        // 设置责任链
        validationC.setNext(processingC).setNext(localStorageC).setNext(networkRequestC)
        // 处理请求
        validationC.handle(Request(data = ""))
    }

总结

使用责任链模式可以避免大量的条件语句,使代码更加可扩展和可维护。同时,它也符合单一职责原则,每个处理者只需要关注自己的责任,而不需要关注其他的逻辑。


http://www.kler.cn/a/321981.html

相关文章:

  • 数据结构之二叉树(1)
  • 本地生活服务项目揭秘!谁搭建的本地生活服务商作业系统收益效果好?
  • 使用ELK Stack进行日志管理和分析:从入门到精通
  • JDK7和JDK8中的HashMap有什么区别?
  • 初学51单片机之I2C总线与E2PROM
  • Java 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)
  • 【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常
  • git 清除二进制文件的 changes 状态
  • [笔记]某华AICrane系统全景笔记
  • 鸿蒙界面开发(九):列表布局 (List)
  • 数据结构 - 查找算法
  • 重生之我们在ES顶端相遇第16 章 - Lucene 写入流程
  • 官方换装规格,多种。支持证件照制作的api接口
  • IDEA插件开发入门
  • jekins忘记admin密码
  • H3C R4900 G3服务器上配置本地磁盘RAID
  • 高通平台Android源码下载
  • 使用 Llama-index 实现的 Agentic RAG-Router Query Engine
  • 【rabbitmq-server】安装使用介绍
  • Redis篇(初识Redis)