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

23种设计模式之命令模式

命令模式

1、定义

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

2、命令模式结构

  • Command(抽象命令类):一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作
  • ConcreteCommand(具体命令类):是抽象命令类的子类,实现了抽象类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中,在实现execute()时将调用接收者对象的相关操作
  • Invoker(调用者):请求发送者,通过命令对象来执行请求
  • Receiver(接收者):执行与请求相关的操作,具体实现对请求的业务处理
    在这里插入图片描述

3、示例代码

Command

public abstract class Command {protected Receiver receiver;public Command(Receiver receiver) {this.receiver = receiver;}public abstract void execute();
}

ConcreteCommand

public class ConcreteCommand extends Command {public ConcreteCommand(Receiver receiver) {super(receiver);}@Overridepublic void execute() {receiver.receive();}
}

Invoker

public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void execute() {command.execute();}
}

Receiver

public class Receiver {public void receive() {System.out.println("This is Receive class!");}
}

Test

public class Client {public static void main(String[] args) {Receiver rec = new Receiver();Command cmd = new ConcreteCommand(rec);Invoker i = new Invoker();i.setCommand(cmd);i.execute();}
}

输出

This is Receive class!

4、命令模式的优缺点

优点:

  • 降低系统耦合度
  • 新的命令可以很容易加入到系统中
  • 可以比较容易的设计一个命令队列或组合命令
  • 为请求的撤销和恢复操作提供了一种设计和实现方案

缺点:

  • 可能会导致系统有过多的具体命令类。

5、命令模式适用环境

  • 抽象出待执行的动作以参数化某个对象
  • 在不同的时刻指定排列和执行请求
  • 支持取消操作
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍
  • 用构建在原语操作上的高层抽象操作构造一个系统

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python(re模块的具体使用)
  • QT通用配置文件库(QPreferences)
  • 【云原生】Prometheus整合Alertmanager告警规则使用详解
  • [集成学习]基于python的Stacking分类模型的客户购买意愿分类预测
  • CentOS 7 yum官方源失效
  • 分布式ID是什么?有哪些解决方案?
  • 准备跳槽了(仍然底层为主,ue独立游戏为辅)
  • 贝叶斯算法理论
  • vue3 antdv3 a-range-picker a-date-picker 获取选择中的日期值
  • LeetCode热题100刷题16:74. 搜索二维矩阵、33. 搜索旋转排序数组、153. 寻找旋转排序数组中的最小值、98. 验证二叉搜索树
  • Python学习笔记40:游戏篇之外星人入侵(一)
  • 【Linux】汇总TCP网络连接状态命令
  • 【Django】网上蛋糕商城后台-订单管理
  • Learning vtkjs之WarpScalar
  • HOW - 保证 WebSocket 持续正常连接
  • [PHP内核探索]PHP中的哈希表
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Angular 4.x 动态创建组件
  • C++入门教程(10):for 语句
  • Flannel解读
  • Leetcode 27 Remove Element
  • Linux下的乱码问题
  • linux学习笔记
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL的数据类型
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • sessionStorage和localStorage
  • Spring-boot 启动时碰到的错误
  • Vue ES6 Jade Scss Webpack Gulp
  • 猴子数据域名防封接口降低小说被封的风险
  • 回顾 Swift 多平台移植进度 #2
  • 聊聊flink的BlobWriter
  • 前端工程化(Gulp、Webpack)-webpack
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 思维导图—你不知道的JavaScript中卷
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 译有关态射的一切
  • 硬币翻转问题,区间操作
  • 从如何停掉 Promise 链说起
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 进程与线程(三)——进程/线程间通信
  • ​​​【收录 Hello 算法】9.4 小结
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ubuntu下安装kvm虚拟机
  • ## 1.3.Git命令
  • (33)STM32——485实验笔记
  • (4)STL算法之比较
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (不用互三)AI绘画工具应该如何选择
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (力扣)1314.矩阵区域和
  • (七)glDrawArry绘制
  • (四)汇编语言——简单程序