设计模式-命令模式

关键!C#工业上位机界面设计终极指南:WinForm/WPF怎么选?【工业实战完整版,无废话选型+避坑+落地技巧】 工业上位机UI选型指南:WinForm与WPF核心对比 摘要: 本文基于工业实战视角,对比WinForm与WPF在工业上位机开发中的适用性。WinForm凭借GDI+原生渲染、极致兼容性(完美支持Win7/XP)、低资源占用和硬件底层调用优势,成为老旧工控机、简单监控系统和7×24小时运行设备的首选。WPF则依托DirectX硬件加速、MVVM架构和强大可视化能力,更适合复杂可视化大屏、3D模拟等高端场景及需要长期迭代的大型项目。核心选型原则是:优先考虑稳定性与兼容性,WinForm解决"能不能用 阅读详情

命令模式

定义

  • 命令封装
    • 每一个命令是一个操作
  • 解耦请求方和接收方
  • 请求方只需要请求执行命令,不需要关心命令是怎么被接受,操作和是否被执行

行为型模式

生活中的场景

遥控器

餐厅点菜

把需求和执行解耦

适用场景

  • 现实语义中具备命令的操作
    • shell命令
    • 命令菜单
  • 调用者和请求的接受者需要解耦
    • 调用者不需要关心具体命令的执行细节,只需要把对应的命令传递出去就行了
  • 需要抽象出等待执行的行为
    • 撤销
    • 恢复等操作
  • 需要支持命令宏
    • 命令组合操作

shell 中的help命令

通用类图

image-20210108105644830

  • Receive接收者角色该角色就是干活的角色,命令传递到这里是应该被执行的
  • Command命令角色需要执行的所有命令都在这里声明。
  • Invoker调用者角色接收到命令,并执行命令。

具体案例

​ 假如我们自己开发一个播放器,播放器有播放功能、有拖动进度条功能、停止播放功能、暂停功能,我们自己去操作播放器的时候并不是直接调用播放器的方法,而是通过一个控制条去传递指令给播放器内核,那么具体传达什么指令,会被封装为一个ー个的按钮。

​ 那么每个按钮的就相当于是对一条命令的封装。用控制条实现了用户发送指令与播放器內核接收指令的解耦。

播放器定义

public class GPlayer {
  public void play(){
    System.out.println("正常播放");
  }

  public void speed(){
    System.out.println("拖动进度条");
  }

  public void stop(){
    System.out.println("停止播放");
  }

  public void pause(){
    System.out.println("暂停播放");
  }
}

抽象执行的动作定义

public interface IAction {
    void execute();
}

播放动作

public class PlayAction implements IAction {
  private GPlayer gplayer;

  public PlayAction(GPlayer gplayer) {
    this.gplayer = gplayer;
  }

  public void execute() {
    gplayer.play();
  }
}

暂停动作

public class PauseAction implements IAction {
  private GPlayer gplayer;

  public PauseAction(GPlayer gplayer) {
    this.gplayer = gplayer;
  }

  public void execute() {
    gplayer.pause();
  }
}

具体的执行类

这个是具体的执行类,也是我们提供给客户的基础动作入口

public class Controller {
  private List<IAction> actions = new ArrayList<IAction>();

  public void addAction(IAction action){
    actions.add(action);
  }

  public void execute(IAction action){
    action.execute();
  }

  public void executes(){
    for (IAction action:actions) {
      action.execute();
    }
    actions.clear();
  }
}

测试

public class Test {
  public static void main(String[] args) {

    GPlayer player = new GPlayer();
    Controller controller = new Controller();
    controller.execute(new PlayAction(player));

    controller.addAction(new PauseAction(player));
    controller.addAction(new PlayAction(player));
    controller.addAction(new StopAction(player));
    controller.addAction(new SpeedAction(player));
    controller.executes();
  }
}

也可以构建一个链通过建造者模式来快速增加Action

image-20210109004356128

源码中的体现

JDK Runnable

Runnable是抽象,具体的实现是用户来实现的

Thread#start执行后会抢CPU

通过有接口的命令抽象,我们可以有很多的扩展,Run中的逻辑就是一条一条的命令,我们调用者并不需要底层是如何调度CPu的,只需要传入命令也就是Runnable就行了

Junit Test

public interface Test {
  /**
     * Counts the number of test cases that will be run by this test.
     */
  public abstract int countTestCases();

  /**
     * Runs a test and collects its result in a TestResult instance.
     */
  public abstract void run(TestResult result);
}

junit.framework.TestCase

@SuppressWarnings("deprecation")
public static void assertTrue(String message, boolean condition) {
  Assert.assertTrue(message, condition);
}

@SuppressWarnings("deprecation")
public static void assertTrue(boolean condition) {
  Assert.assertTrue(condition);
}

同理,单元测试,用户可以不用关心内核,直接调用就行了

总结

优缺点

优点
  • 类间解耦
    • 调用者和接受者之间没有任何依赖关系
    • 调用者实现的时候只需要调用Command抽象类的execute方法就行了
    • 不需要了解到底是谁在执行
  • 可扩展性
    • Command的子类非常容易扩展,调用者Invoker和高层次的Client不产生严重的代码耦合
  • 命令模式结合其他模式会更优秀
    • 命令模式可以结合责任链模式,实现命令族解析任务
    • 结合模板方法模式,则可以减少Command子类的膨胀问题。
缺点
  • 如果有N个命令,就需要N个Command的子类,类膨胀非常大

使用场景

​ 只要你认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反馈机制的处理等。

我的笔记仓库地址gitee 快来给我点个Star吧

汉书HE8,好用的汇编代码编写工具 汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大 立即下载

相关推荐

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 357

设计模式第19讲——命令模式(Command)

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0 UML类图 5.1 抽象命令(Command)——Command5.2接收者(Receiver)——Chef5.3具体命令(Concrete Command)——OrderCommand六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

PX4笔记系列(二)vtol_att_control中的tiltrotor解析

update_vtol_state() 注释:采用两段切换的简单逻辑来进行过渡 当切换过渡开关后,飞机将会开始倾转动力,逐渐加速,当飞机获得足够速度后动力将会完全打到向前的位置。对于过渡返回阶段动力则是简单地倾转回来。 如果(不在向前过渡指令下): 当前vtol飞行模式: 1、旋翼模式 无操作 2、固定翼模式 令vtol飞行模式切换到过渡返回模式 3、P1过渡模式 进入过渡失败安全返回至旋翼模式 4、P2过渡模式 进入过渡失败安全返回至旋翼模式 5、过渡返回模式 记录过渡返回时间=当前时间-过渡开始

hypersonicss的博客 1880

设计模式之【命令模式】,方法调用的花式玩法

命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令是怎样被接受,怎样被操作以及是否被执行等。命令模式属于行为型模式。原文:将一个请求封装成医德对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,因为这样的实现简单明了。

秃了也弱了 3751

eNSP搭建基础网络

1、除5的环回地址固定以外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2、R1-R4每个路由器存在两个环回接口,用于模拟连接pc网段﹔地址也在192.168.1.0/24这个网络范围内 3、R1-R4上不能直接编写到达5.5.5.0/24的静态路由,但依然可以访问 4、全网可达,尽量减少每台路由器,路由表条目数量,避免环路出现5R4与R5间,正常100oA链路通信,故障时自动改为100M 全网使用192.168.1.0/24网段进行划分,尽量减少路由条目Pc端IP使用pHcP技

在月光下棕榈树的叶子在瑟瑟抖动 8469

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 540

设计模式-命令模式(Command)

命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点是可以将请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

miaoyl的博客 2945

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记...

ThinkWon的博客 5373

别急着做AI:FDE教你识别真需求,让AI真正落地

人工智能项目在落地过程中,经常出现业务方高喊“我们要做AI”,却说不清具体应用场景的现象。判断一个需求是否值得用AI实现,不能只看技术流行度,而要从问题出现频率、当前替代方案以及可量化业务价值三个维度展开验证。同时需要冷静比较规则引擎与大模型的边界:不是所有语义任务都要靠生成式模型,稳定、可解释且低成本的传统方案往往更具工程性价比。数据闭环也至关重要,缺乏历史样本与反馈回流路径的项目,很难在真实环境中持续优化。针对智能客服、合同审查或企业知识库等典型场景,可借助人机协同与最小代价的用户验证,逐步筛除伪需求,

weixin_42624889的博客 341

Unipush2.0 App消息推送(在线+离线推送)

使用unipush2.0进行消息推送,包含在线跟离线

weixin_50251467的博客 3699

设计模式之-命令模式,快速掌握命令模式,通俗易懂的讲解命令模式以及它的使用场景

在上面的示例中,Command是抽象命令接口,定义了命令的执行方法execute。OpenTVCommand和CloseTVCommand是具体命令类,分别实现了抽象命令接口,并在execute方法中调用接收者对象的相应方法。在现实生活中,命令模式的例子可以是遥控器。遥控器上的按钮(客户端)发送命令(请求)给电视(接收者),电视根据命令进行相应的操作。命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化,并且能够支持请求的排队执行、记录日志、撤销和重做等操作。

咖啡程序员 2002

STM32串口DMA双缓冲机制实战:提升数据传输效率的终极方案

本文深入解析了STM32串口DMA双缓冲机制的核心原理与实战配置。通过对比传统中断方式,阐述了双缓冲如何实现数据接收与处理的“无缝接力”,从而在工业传感器数据采集等高负载场景下,将CPU占用率降至极低水平并彻底避免数据丢失。文章提供了基于标准外设库的详细配置步骤、中断处理逻辑及性能实测数据,是提升嵌入式系统串口通信效率和可靠性的终极方案。

weixin_29192365的博客 80

Java设计模式 Design Pattern:命令模式 Command Pattern

Java设计模式 Design Pattern:命令模式 Command Pattern 目的 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support un...

ahch8077的博客 164

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

23种设计模式之命令模式(Command Pattern)

大家好,我是小威,24届毕业生,在一家满意的公司实习。命令模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二十三种设计模式——命令模式(Command Pattern)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为...

也曾北风温柔以待 301

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

设计模式-命令模式-Command Pattern

创建一个命令接口,它包含执行操作的方法(如。

wesigj的博客 2031

您的设计模式——命令模式【Command Pattern 】

今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思, 但是更深化了,用模式来描述真是是世界的命令情况。正在看这本书的你,我猜测分为两类:已经工作的和没有 工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参加工作,你肯定会待在项目组,那 今天我们就以项目组为例子来讲述命令模式。 我是我们部门的项目经理,就是一个项目的头,在中国做项目

420

设计模式教程:命令模式(Command Pattern)

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

遇见伯灵说的博客 2035

秒懂设计模式之命令模式(Command Pattern)

[版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.youkuaiyun.com/ShuSheng0007/article/details/116035276 出自:shusheng007 设计模式汇总篇,一定要收藏: 永不磨灭的设计模式(有这一篇真够了,拒绝标题党) 文章目录概述类型难度定义使用场景UML实例第一步:声明一个命令接口 (Command)第二步:构建那些可以具体完成命令的角色(Receiver)第三步:构建各种具体命令(ConcreteCommand)第四步:构建命令的调.

ShuSheng007的程序人生 3321

设计模式命令模式(CommandPattern)

核心模块:抽象命令类、具体命令类、命令接收者、调用者 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:不知道请求的接收者,不知道请求的操作,主要封装不同的命令,可以使用这种松耦合的方式; 优点:低耦合度,新的命令很容易添加到系统,支持undo和redo操作,和命令队列; 缺点:如果命令过多导

didiao11300的专栏 268

【设计模式】命令模式(Command Pattern) 服务我要个火锅ru

目录 一.介绍 二.场景 三.实现 四.dome代码 一.介绍 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这.

corleone_4ever的博客 270

23种设计模式——命令模式(Command Pattern)

本文介绍了23种经典设计模式之——命令模式(Command Pattern)的使用及说明

Meteors.的博客 688

设计模式之命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 结构 命令模式的主要角色有: 命令(Command):为所有命令声明了一个接口。调用命令对象的 execute()方法,就可以让接收者进行相关的操作。这个接口也具备一个 undo(...

weixin_44437403的博客 150

设计模式(十五)——命令模式(Command Pattern)

命令模式(Command Pattern) 基本介绍 命令模式:将一一个请求封装为一一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式、事务transaction模式。 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 在命名模式中,会将一个请求封装为一个对象,以便使用...

Duktig的博客 369

Java设计模式——命令模式【Command Pattern】

Java设计模式、命令模式、Command Pattern

scorpio的博客 1039
上一篇: 设计模式-迭代器模式
下一篇: Mybatis-应用分析和最佳实践-核心配置
黄金时代的架构之路
博客等级 码龄12年 540粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值