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

Java设计模式(命令模式)

定义

       将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。

角色

      抽象命令类(Command):声明用于执行请求的execute方法,通过它可以调用请求接收者的相关操作。

      具体命令类(ConcreteCommand):具体实现了执行请求的execute方法,同时定义了接收者对象,并在执行方法时调用接收者的相关操作。

      调用者(Invoker):即请求的发送者,它通过命令对象来执行请求。它不需要在设计时确定具体接收者,在程序运行时注入对应的命令对象,从而实现间接地调用请求接收者的相关操作。

      接收者(Receiver):具体实现对请求的业务处理。

优点

      降低了系统的耦合度

      新的命令可以很容易地加入到系统中,符合开闭原则

      可以比较容易地设计一个命令队列或宏命令(组合命令)

      为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案

缺点

      使用命令模式可能会导致某些系统有过多的具体命令类(针对每一个对请求接收者的调用操作都需要设计一个具体命令类)

适用场景

      系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互

      系统需要在不同的时间指定请求、将请求排队和执行请求

      系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作

      系统需要将一组操作组合在一起形成宏命令

案例

      为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,例如功能键FunctionButton可以用于退出系统(由SystemExitClass类来实现),也可以用于显示帮助文档(由DisplayHelpClass类来实现)。用户可以通过修改配置文件来改变功能键的用途,现使用命令模式来设计该系统,使得功能键类与功能类之间解耦,可为同一个功能键设置不同的功能。

类图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 今日Java练习:选择题挑战
  • 用OpenCV与MFC写一个简单易用的图像处理程序
  • 9.C基础_指针与数组
  • 【vue3|第21期】Vue3中Vue Router的push和replace方法详解
  • 服装行业QMS中的来料检验:常见问题解析与解决策略
  • 贪心算法总结(3)
  • 设计模式的概念及必要性
  • Synchronized 的底层原理——Java全栈知识(40)
  • Flink SQL 基础操作
  • 注解Spring @AliasFor使用笔记
  • 知识点——样本间独立性,传统表征学习,显式物理连接,隐含交互,噪声,类相关类无关
  • 从零开始的CPP(37)跳跃游戏,动态规划,贪心算法
  • 纷享销客CRM AI产品架构概览、产品特色
  • Github 2024-08-09 开源项目日报 Top10
  • git的一些操作指令
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • LeetCode18.四数之和 JavaScript
  • React-redux的原理以及使用
  • Redis 懒删除(lazy free)简史
  • Redis 中的布隆过滤器
  • SQLServer之创建显式事务
  • Vue.js 移动端适配之 vw 解决方案
  • 测试开发系类之接口自动化测试
  • 创建一个Struts2项目maven 方式
  • 关于List、List?、ListObject的区别
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 理清楚Vue的结构
  • 强力优化Rancher k8s中国区的使用体验
  • 一份游戏开发学习路线
  • 阿里云重庆大学大数据训练营落地分享
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十) 初识 Docker file
  • (四)软件性能测试
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转) Android中ViewStub组件使用
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)负载均衡,回话保持,cookie
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***检测工具之RKHunter AIDE
  • ***原理与防范
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Redis的秒杀Dome和异步执行
  • .NET 给NuGet包添加Readme
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)