Command模式(命令) 说明和使用场景

 

 Command模式(命令)
   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Command(命令模式)模式是比较常用的一个模式.
   Command命令模式: Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
   优点: 解耦了调用者和接受者之间联系。调用者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,调用者无需知道接受者任何接口。
   缺点: 造成出现过多的具体命令类
  
   在此写了7个java类来描述说明Command设计模式的实现方式;

  1、 Control.java        命令控制者对象类
  2、 Tv.java             命令接收者对象类
  3、 Command.java        命令接口类
  4、 CommandChannel.java 频道切换命令类
  5、 CommandOff.java     关机命令类
  6、 CommandOn.java      开机命令类
  7、 CommandTest.java    带有main方法的测试类(命令发送者)

 

===============   1、 Control.java
package command;

//命令控制者
public class Control {
  private Command onCommand, offCommand, changeChannel;

  public Control(Command on, Command off, Command channel) {
    onCommand = on;
    offCommand = off;
    changeChannel = channel;
  }

  public void turnOn() {
    onCommand.execute();
  }

  public void turnOff() {
    offCommand.execute();
  }

  public void changeChannel() {
    changeChannel.execute();
  }
}
===============   1 end

 

===============   2、 Tv.java
package command;

//命令接收者
public class Tv {

  public int currentChannel = 0;

  public void turnOn() {
    System.out.println("The televisino is on.");
  }

  public void turnOff() {
    System.out.println("The television is off.");
  }

  public void changeChannel(int channel) {
    this.currentChannel = channel;
    System.out.println("Now TV channel is " + channel);
  }
}
===============   2 end

 

===============   3、 Command.java
package command;

//命令接口
public interface Command {
  void execute();
}
===============   3 end

 

===============   4、 CommandChannel.java
package command;

//频道切换命令
public class CommandChannel implements Command {
  private Tv myTv;

  private int channel;

  public CommandChannel(Tv tv, int channel) {
    myTv = tv;
    this.channel = channel;
  }

  public void execute() {
    myTv.changeChannel(channel);
  }
}
===============   4 end

 

===============   5、 CommandOff.java
package command;

//关机命令
public class CommandOff implements Command {
  private Tv myTv;

  public CommandOff(Tv tv) {
    myTv = tv;
  }

  public void execute() {
    myTv.turnOff();
  }
}
===============   5 end

 

===============   6、 CommandOn.java
package command;

//开机命令
public class CommandOn implements Command {
  private Tv myTv;

  public CommandOn(Tv tv) {
    myTv = tv;
  }

  public void execute() {
    myTv.turnOn();
  }
}
===============   6 end

 

===============   7、 CommandTest.java
package command;

//命令发送者
public class CommandTest{
  public static void main(String[] args){
    //命令接收者
    Tv  myTv = new Tv();
    //开机命令
    CommandOn on = new CommandOn(myTv);
    //关机命令
    CommandOff off = new CommandOff(myTv);
    //频道切换命令
    CommandChannel channel = new CommandChannel(myTv, 2);
    //命令控制对象
    Control control = new Control( on, off, channel);

    //开机
    control.turnOn();
    //切换频道
    control.changeChannel();
    //关机
    control.turnOff();
  }
}
===============   7 end


  Command模式通常可应用到以下场景:
  1 Multi-level undo(多级undo操作)
    如果系统需要实现多级回退操作,这时如果所有用户的操作都以command对象的形式实现,系统可以简

    单地用stack来保存最近执行的命令,如果用户需要执行undo操作,系统只需简单地popup一个最近的

    command对象然后执行它的undo()方法既可。
 
  2 Transactional behavior(原子事务行为)
    借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,往往需要回退到执

    行前的状态,可以借助command对象保存这种状态,简单地处理回退操作。

 

  3 Progress bars(状态条)
    假如系统需要按顺序执行一系列的命令操作,如果每个command对象都提供一个

    getEstimatedDuration()方法,那么系统可以简单地评估执行状态并显示出合适的状态条。

 

  4 Wizards(导航)
    通常一个使用多个wizard页面来共同完成一个简单动作。一个自然的方法是使用一个command对象来封

    装wizard过程,该command对象在第一个wizard页面显示时被创建,每个wizard页面接收用户输入并设

    置到该command对象中,当最后一个wizard页面用户按下“Finish”按钮时,可以简单地触发一个事件

    调用execute()方法执行整个动作。通过这种方法,command类不包含任何跟用户界面有关的代码,可以

    分离用户界面与具体的处理逻辑。

 

  5 GUI buttons and menu items(GUI按钮与菜单条等等)
    Swing系统里,用户可以通过工具条按钮,菜单按钮执行命令,可以用command对象来封装命令的执行。

 

  6 Thread pools(线程池)
    通常一个典型的线程池实现类可能有一个名为addTask()的public方法,用来添加一项工作任务到任务

    队列中。该任务队列中的所有任务可以用command对象来封装,通常这些command对象会实现一个通用的

    接口比如java.lang.Runnable。

 

  7 Macro recording(宏纪录)
    可以用command对象来封装用户的一个操作,这样系统可以简单通过队列保存一系列的command对象的状

    态就可以记录用户的连续操作。这样通过执行队列中的command对象,就可以完成"Play back"操作了。

 

  8 Networking
    通过网络发送command命令到其他机器上运行。

 

 9 Parallel Processing(并发处理)
    当一个调用共享某个资源并被多个线程并发处理时。

如何通过 Python 爬虫抓取并分析政府开放数据 通过本文的介绍,我们展示了如何使用Python 爬虫抓取并分析政府开放数据。通过requests获取政府开放数据的 API 接口数据。使用和pandas进行数据清洗与存储。使用matplotlib对数据进行可视化。你可以根据不同的政府开放平台和数据集进行调整,应用于不同领域的数据分析,如公共健康、交通、环保等。 阅读详情

相关推荐

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

命令模式

Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Command(命令模式)模式是比较常用的一个模式. Command命令模式: Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。将一个请求封...

不懂夜的黑 241

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1639

Mac command+c或command+v失效解决办法之一

热键冲突的问题,若Mac开启了有道词典自动取词功能,退出取词功能即可! 也有可能是有道云笔记导致的。。。退出了就好了,或者是把command转移换成其他的不常用的键,移位试试,可以自定义把不常用的大写锁定键改成command键 ...

ios_xumin的专栏 5万+

SoC验证新思路:除了UVM仿真,你还可以试试Cadence JasperGold的形式化验证

本文深入探讨了Cadence JasperGold形式化验证在SoC设计中的创新应用,对比传统UVM仿真验证,详细解析了其数学穷尽性验证优势。通过实战案例展示了JasperGold在总线协议、时钟域交叉等关键场景的验证方法,并提供了混合验证流程设计与效能优化方案,帮助工程师提升验证效率30%以上。

weixin_30566063的博客 122

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

基于face_recognition库实现人脸考勤系统功能。利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备“刷脸打卡”、“新学生注册”等功能。............

lyx4949的博客 6968

线程池execute(Runnable command)

线程池的线程是如何做到复用的? 线程池是如何做到高效并发的? 从线程池的设计中我们能学到什么? 为什么要使用线程池? 线程在java中是一个对象,也是操作系统的重要资源,线程的创建销毁都需要时间 java对象占用堆内存,操作对象线程占用系统内存,根据JVM规定,一个线程默认最大栈大小是1M,这个栈大小内存空间是需要从系统内存中分配的,线程过多会消耗很多内存 操作系统需要频繁的上下文切换,影响性能 为了控制线程的数量,引入了线程池: 降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统

qq_39176007的博客 2115

XR Interaction Toolkit实战:为HTC Vive Cosmos打造抓取、投掷与UI交互(Unity 2023教程)

本文详细介绍了如何使用Unity 2023和XR Interaction Toolkit为HTC Vive Cosmos开发抓取、投掷与UI交互系统。通过实战案例'VR投掷训练室',从基础配置到高级功能实现,涵盖物理抓取、精准投掷机制和VR UI交互设计,帮助开发者提升VR交互开发技能。

weixin_30562507的博客 257

activiti实现Command接口,自定义功能

若activiti中的方法无法满足业务需求,则实现Command接口,包名org.activiti.engine.impl.interceptor.Command。重写execute方法,使用managementService调用executeCommand。这个看自己需要可以处理task,流程变量之类的。

Victor_Frankenstein的博客 888

迪文DGUSII串口屏中文显示实战:手把手教你制作16x16点阵字库

本文提供了一份迪文DGUSII串口屏16x16点阵中文字库制作的完整实战指南。从显示原理、字体选择与参数设置,到使用FontLib Make工具生成字库文件,再到部署、调用及存储空间优化,手把手教你解决中文显示难题,确保界面文字既美观又稳定。

weixin_29190573的博客 156

SAP 系统间信任关系配置全攻略:从 SM59 到 SMT1 的实践与风险控制

本文介绍了在SAP系统间配置信任关系的详细流程与最佳实践。文章以SAP Gateway与后端系统架构为场景,从SM59创建RFC目的地开始,到SMT1建立信任关系,再到授权对象S_RFCACL的配置,提供了完整的操作指南。重点包括:使用标准命名规范创建专用RFC连接、通过向导完成系统间信任登记、严格控制S_RFCACL授权范围等。文中还分享了真实项目案例、可复用的检查清单以及常见问题的排查思路,帮助用户实现稳定可靠的跨系统无密码调用,同时确保安全性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 325

java command设计模式_Java23种设计模式案例:命令模式(Command)

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。1、适用场景(1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交...

weixin_32734545的博客 226

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1182

设计模式|命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装成对象,从而使你可以参数化其他对象对请求的执行。在命令模式中,请求的发送者和接收者之间不直接交互,而是通过一个命令对象来解耦。这使得请求发送者无需知道请求的具体操作或者接收者,从而增强了系统的灵活性和可扩展性。

weixin_44435110的博客 2001

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

Command(命令)模式是一种行为设计模式,它将请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。

gwndjsh的博客 331

NTscan扫描工具

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

vim不保存退出_Vim快速上手指导

Vim是从Vi发展而来的一个文本编辑器,是程序员最喜欢的文本编辑器之一。1、Vim四种模式介绍Vim的基础命令和操作之前,首先要了解一下Vim的四种模式。Normal模式:Normal模式是最常用的模式,在该模式下,主要浏览、修改文本内容;Insert模式:在该模式下,主要添加文本内容;Visual模式:在该模式下,主要选取文本内容,还可以以行或列为单位选取文本内容,有一种用鼠标选择的即视感,非常...

weixin_39882948的博客 3077

【avalonia教程】17mvvm简介、command

摘要:MVVM是Model-View-ViewModel架构模式,其中Model处理业务数据,View负责UI展示,ViewModel作为中间层实现数据绑定和命令绑定。该模式通过分离关注点提高代码可维护性和可测试性。示例中展示了Command模式的实现方式,相比传统Click事件更灵活,能适应不同DataContext的场景。MVVM通过数据绑定实现View和ViewModel的自动同步,是现代化UI开发的重要模式。

baidu_33755215的博客 597

linux常用命令索引

在这三个级中,有三种权限:读、写和执行。-s若用-s参数,则ash从标准输出中读入命令,如果不跟-c-s参数则ash以所跟的第一个参数为文件名,从此文件中读入命令,直接输出到exit。该命令可以即时显示当前系统占用CPU时间的进程,它同时提供一个交互的界面让用户可以观察系统进程情况,并按照CPU使用情况、占用内存大小、运行时间来对进程排序,这是系统管理的一项必不可少的工具。如:minix,ext,ext2,xiafs,hpfs,msdos,umsdos,vfat,nfs,iso9660,smbfs等等。

GJZGRB的博客 99

Command模式

Command模式 介绍: Command模式通过将请求封装到一个对象(Command)中,并将请求的接收者存放到具体的ConcreteCommand类(Receiver)中, 从而实现调用操作的对象和操作的具体实现之间的解耦。 Command类中一般只是一些接口的集合,并不包含任何的数据属性(当然,也可有)。 C+

yangchuankai's blog 1762

行为设计模式之Command (命令)

需要发出请求的对象(调用者)和接收并执行请求的对象(执行者)之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象,这个Command对象内部持有真正执行操作的Receiver(如文档编辑器、打印服务)的引用,并知道调用Receiver的哪个方法。改变按钮功能只需更换绑定的Command对象。

qq_45938780的博客 1188

COMMAND(命令)模式

文章目录描述定义类型动机UML类图实现主要角色示例适用场景优点缺点相关模式 描述 定义 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(Transaction)模式。 类型 对象行为型模式 动机 经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,使用命令模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调

qq_27639777的博客 2716

C++设计模式11——命令(Command)模式

C++设计模式11——命令(Command)模式1. 命令(Command)模式介绍2. 为了方便理解,举个例子3. 命令(Command)模式优缺点 1. 命令(Command)模式介绍 定义:   将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口 使用场景:认为是命令的地方都可

kuanyew的博客 3169

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

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

ProgramNovice的博客 1468

23种设计模式 3 行为型模式 之3.7 command 命令模式

本文基本是搬运,搬运自网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》

刀法孜然的博客 823

深入浅出设计模式——行为型模式之命令模式 Command

本文介绍了命令模式在智能家居控制中的应用。通过将请求封装为对象,实现了发送者(用户)与接收者(家电)的解耦。文章以电灯和风扇为例,展示了如何通过命令模式设计一个统一的智能家居控制系统。主要包含接收者类(Lamp、Fan)、抽象命令类(Command)、具体命令类(LampCommand、FanCommand)和调用者类(Button)。该模式支持灵活扩展新设备,且用户无需了解具体实现细节,只需通过统一接口发送命令即可控制不同家电。代码示例演示了如何使用按钮开关控制家电的开关状态,体现了命令模式的核心优势。

Atticus的博客 1774

命令也是类的 Command模式

文章目录Command模式应用场景本质优点缺点角色Command模式的类图示例程序示例程序的类图示例代码拓展思路相关设计模式满足的原则 Command模式 应用场景 请求队列化 支持取消操作 对系统的操作功能重新执行一遍(恢复) 事务操作 本质 封装请求 优点 命令模式使新的命令很容易地被加入到系统里。 允许接收请求的一方决定是否要否决(Veto) 请求。 能较容易地设计一个命令队列。 可以容易地实现对请求的Undo和Redo。 在需要的情况下,可以较容易地将命念记入日志。 命令模式把请求一个操作

零碎@流年絮语 的博客 537

[设计模式]Command命令模式

command命令模式 Command模式通过将请求封装到一个对象(Command)中,并将请求的接收者存放到具体的ConcreteCommand类中的(reciver)中,从而实现调用操作的对象和操作的具体实现之间的解耦。 解析:Command模式的思想是把命令封装在一个类(Command)中,同时把接收对象也封装在一个类(Receive)中,由调用这个命令的类(Invoker)来调用...

超越 2658
上一篇: UML类之间的关系
下一篇: java中实现换行的几种方法
programloverjack
博客等级 码龄17年 5粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值