Kotlin~Command模式

概念

把请求转化为独立的对象

角色介绍

  • Command: 命令接口
  • ConcreteCommand: 具体命令实现类

UML

命令模式

代码实现

interface Command {fun execute(vararg arg: String):Int
}
class Print : Command {override fun execute(vararg arg: String): Int {println("Print:${arg.toList()}")return 1}
}
class None : Command {override fun execute(vararg arg: String): Int {println("None:${arg.toList()}")return 1}
}
class CommandProcessor {fun handle(className: String, vararg arg: String): Int? {try {val pkg = this.javaClass.`package`?.nameval command: Command = Class.forName("$pkg.$className").newInstance() as Commandreturn command.execute(*arg)} catch (e: Exception) {println("未知命令")e.printStackTrace()}return null}
}fun main() {val cp = CommandProcessor()cp.handle("None", "12")cp.handle("Print", "12", "123")cp.handle("", "12", "123")
}

输出

None:[12]
Print:[12, 123]
未知命令
java.lang.ClassNotFoundException: com.dp.command.
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
at com.dp.command.CommandProcessor.handle(CommandProcessor.kt:7)
at com.dp.command.CommandProcessorKt.main(CommandProcessor.kt:21)
at com.dp.command.CommandProcessorKt.main(CommandProcessor.kt)

优缺点

优点

  • 动作封装
  • 解偶发送者和接收者
  • 可扩展性
  • 简化和集中错误处理
  • 支持撤销和重做功能,可与备忘录结合实现命令的撤销与恢复
  • 易于实现宏命令和组合命令

缺点

  • 复杂度增加
  • 性能开销

应用场景

  • 文本编辑器
  • 图新编辑器
  • 不同进程间交互

总结

命令模式的结果就是接收方的执行结果,但为了以命令的形式设计,引入额外类型增加理解上的困难。不过这也是设计模式的通病,抽象必然会增加额外的类,代码抽离肯定会比聚合更加难理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15605.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些行业报告--From 艾瑞咨询

一些行业报告--From 艾瑞咨询 1 介绍2 机械臂行业研究 [From 艾瑞咨询 -- 中国工业机器人行业研究报告(2023)2.1 发展历程2.2 中国工业机器人相关政策2.3 产业链2.4 三大部分六大系统2.5 伺服&控制器 主要玩家 及 关键指标及难点2.6 减速机 主要玩家…

面向 “大模型” 的未来服务架构设计

文章目录 大模型热潮大模型落地服务设计 or 重构未来的服务架构微服务化分层化 大模型应用架构架构设计图架构 Demo 实现 小结附录 大模型热潮 今年的互联网赛道中 “顶流” 非大模型莫属。 科技部新一代人工智能发展研究中心 5 月底发布的《中国人工智能大模型地图研究报告》显…

Linux下使用curl命令发送GET和POST请求

目录: 1、发送get请求带请求头2、发送post请求带请求头带参数 1、发送get请求带请求头 curl -X GET "http://localhost:8080/onlinePreviewCallbackApiManagement/v1/3rd/file/info" -H "accept: */*" -H "X-Weboffice-File-Id: 123"…

图像增广:强化深度学习的视觉表现力

目录 摘要: 1. 图像增广简介 2. 图像增广的原理 3. 常见的图像增广技术 4. 如何在实际项目中应用图像增广 5.实际应用 摘要: 当今,深度学习已经在计算机视觉领域取得了令人瞩目的成就。图像增广作为一种数据处理技术,让我们…

FreeRTOS ~(七)互斥量 ~ (2/3)互斥量解决优先级反转问题

前情提要 FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷 FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷 FreeRTOS ~(六)信号量 ~ (2/…

swiftUI和swift的区别

概述 SwiftUI是苹果公司推出的一种用于构建iOS、macOS、watchOS和tvOS应用程序界面的框架。它是基于Swift编程语言开发的,旨在简化UI开发过程并提供实时预览功能,使开发人员可以更快地构建出漂亮的应用程序界面。 Swift是苹果公司推出的一种面向对象的…

Openlayers实战:overlay上播放视频

在企业或者城市等的宣传上,视频能很好的传达出一些信息。 那么在openlayer中如何展示视频呢, 可以通过overlay的方式,点击某一个点,弹出overlay层,展示出视频,并自动播放。下面的实战就能够达到这种效果。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还…

OPPO手机便签怎么设置字体颜色?便签调整字体颜色方法

OPPO是一个非常受年轻人青睐的手机品牌,它的手机不仅外观设计时尚轻薄,而且拍照清晰、系统流畅,并且拥有高中低不同档次的价位可供消费者选择。虽然OPPO手机的使用体验非常不错,但是有一部分用户也遇到了一些问题,例如…

牛客小白月赛75 DE

D 矩阵 登录—专业IT笔试面试备考平台_牛客网 思路:我们能够发现每个点最多只用两种状态,一种是不变,另一种是改变,如果相邻的点与当前点不相同,则可以花费一个单位走过去,否则需要先改变它的状态&#x…

第2集丨JavaScript 中原型链(prototype chain)与继承

目录 一、一些基础概念1.1 ECMAScript 标准1.2 prototype和 __proto__1.3 constructor属性1.4 函数名 二、原型链的维护2.1 内部原型链和构造器原型链2.2 从实例回溯原型链2.3 修正原型指向 三、基于原型链的继承3.1 继承属性3.2 继承“方法” 四、构造函数4.1 案例一个简单的实…

Android加快你的编译速度

工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。 Gradle构建流程 Gradle 的生命周期可以分为大的三个部分:初始化阶段(Initialization Phase),配置阶段(Configuration Pha…

Linux性能优化实践——CPU上下文

CPU上下文切换 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行。这些任务不是真正意义上的并行运行,而是系统在短时间内,将CPU轮流分配给它们,造成任务同时运行的错觉。 CPU需要知道任务从哪里加载,从…