java命令模式

在本教程中,我们将学习命令模式,这是一种重要的行为设计模式。 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能。

命令设计模式中,有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建命令对象。 然后,命令对象在接收器中调用暴露的方法。 因此,发送方对象不需要了解接收方及其公开的方法。

我们还有另一个称为调用程序的对象。 调用程序是负责调用适当的命令对象以完成任务的对象。 我们还可以使用命令管理器来跟踪,调用和操纵命令。

为什么要使用命令设计模式?

命令模式有一些流行的用例:

  • 存储和调度请求:我们可以将请求表示为命令对象,然后可以通过事件触发器将其存储在列表中,在特定时间进行操纵,排队或完成。 例如,可以通过将警报振铃表示为命令对象并在事件触发器上执行警报振铃功能来实现
  • 支持完成/撤消命令模式使我们能够执行或撤消命令执行的操作

由于每个命令对象都支持do / undo操作,因此我们可以扩展此功能以设计文本编辑器的do / undo操作。 这个想法是有两个命令对象列表– 历史记录重做列表:

  • 历史记录列表包含到目前为止已执行的所有命令
  • 另一方面, 重做列表存储我们撤消的命令
  • 对于每个命令请求,都会创建,执行命令对象,然后将其添加到历史记录列表中
  • 在撤消请求时,我们将检查并在历史记录列表中的最新命令上调用撤消操作,然后将该命令放在重做列表中
  • 对于重做操作,我们将使用重做列表上的最新命令,即最近撤消的命令,然后执行该命令并将其再次移至历史记录列表

听起来很简单吧!

UML表示形式:

我们可以将命令设计模式表示为:


我们在哪里

  • 命令:定义命令对象操作的接口或抽象类。
  • ConcreteCommand:这些是包含特定命令实际实现的具体类
  • 接收器:命令类调用接收器以执行请求的操作
  • 调用者:向客户公开的类。 负责调用适当的命令

此外,每个命令类通常都提供以下方法的实现:

  • execute():定义应该完成的工作
  • unexecute():这是负责撤消操作的方法
  • isReversible():如果可以撤消命令,则此方法应返回true ,否则返回false

示例实现:

假设我们必须为文本编辑器实现剪切复制粘贴功能。

因此,我们首先定义Command接口:

public interface Command {void execute();void unexecute();default boolean isReversible() {return true;}
}

另外,假设我们有一个支持文本插入和删除的Document类:

//class which will be our Receiver
public class Document {public void insert(String str, int position) {...}public String delete(int position, int noOfChars) {...}public void copy(int position, int noOfChars) {...}
}

编写具体命令:

现在,我们将定义CutCommand类:

public class CutCommand implements Command {private Document doc;private String text;private int startPosition;private int noOfChars;//suitable constructorpublic void execute() {this.text = this.doc.delete(startPosition, noOfChars);}public void unexecute() {this.doc.insert(text, startPosition);}
}

我们还定义其他两个命令类:

public class CopyCommand implements Command {private Document doc;private int startPosition;private int length;//suitable constructorpublic void execute() {this.doc.copy(startPosition, length);}public void unexecute() {System.out.println("Uncopy operation is blocked");}public boolean isReversible() { return false; }
}public class PasteCommand implements Command {private Document doc;private String text;private int startPosition;//suitable constructorpublic void execute() {this.doc.insert(text, startPosition);}public void unexecute() {this.doc.delete(startPosition, text.length());}
}

众所周知,取消复制不是有效的操作,我们在CopyCommand类的isReversible()方法中返回了false

实施调用者:

最后,我们可以编写一个调用程序类:

public class DocumentInvoker {private Document document;private CommandManager commandManager;public DocumentInvoker(Document document) {this.document = document;commandManager = CommandManage.getInstance();}public void cut(int position, int length) {Command cutCommand = new CutCommand(document, position, length);commandManager.invoke(cutCommand);}public void copy(int position, int length) {Command copyCommand = new CopyCommand(document, position, length);commandManager.invoke(copyCommand);}public void paste(String text, int position) {Command pasteCommand = new PasteCommand(document, text, position);commandManager.invoke(pasteCommand);}}

在这里, CommandManager是管理历史记录和重做列表的类。 调用程序使用所需的信息实例化命令对象,然后调用命令管理器以最终执行操作。

结论:

在本教程中,我们学习了如何在Java中实现命令设计模式。

由于发送方不需要了解任何有关接收方的信息,因此可以促进松散耦合,并且可以简单地调用操作。

翻译自: https://www.javacodegeeks.com/2019/09/command-design-pattern-in-java.html

java命令模式

java命令模式_Java中的命令设计模式相关推荐

  1. java memento_memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  2. java 管理员命令模式_java中命令模式详解和使用方法

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

  3. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  4. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  5. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  6. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  7. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  8. 命令模式 java_JAVA中的命令模式实例教程

    原文链接  作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性 ...

  9. java模板方法模式_Java中的模板方法模式

    java模板方法模式 模板方法模式是一种行为模式,建议在超类中更一般地定义算法. 该算法是在称为模板方法的方法中定义的. 子类仅定义更具体的算法步骤的实现. 使用这种设计模式的好处是,算法后面的任何更 ...

最新文章

  1. java hive 查询语句,使用java连接hive,并执行hive语句详解
  2. ffmpeg mac 批量脚本_使用批处理脚本(BAT)调用FFMPEG批量编码视频
  3. CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇
  4. 数值分析方阵的QR分解
  5. 铁大Facebook——十天冲刺(4)
  6. MVC @Html.TextBox 添加属性和样式
  7. CAD常用命令大全(快捷键和命令说明)
  8. pay.onzan.en app.php,IBOS 协同办公平台PHP版 v1.0
  9. 计算机运行慢 卡是什么原因是什么原因,电脑反应慢是怎么回事?五招让你的电脑快得飞起!...
  10. 手把手教你搭建免费云平台——新浪云
  11. 2017年中国银行业软件测试成果交流会”在京成功举办-「D-Uni」
  12. 面试中被问到“为什么从上一个单位离职”怎么回答
  13. Martin Fowler微服务论文--译文
  14. GNSS-ITRS_GCRS_J2000坐标系的相互转换
  15. 【设计模式】结构型模式之代理模式
  16. 文字翻译器有哪些?文字翻译器哪个好?
  17. 机器学习入门课程笔记(一)——deeplearning.ai: Neural Networks and Deep Learning
  18. 什么是反应式编程? 这里有你想要了解的反应式编程 (Reactive programming)
  19. 破解系统登录密码与软件密码
  20. 国内优秀的免费素材网站大比拼

热门文章

  1. Game of Swapping Numbers
  2. AtCoder 2000 [AGC002F] Leftmost Ball(dp+组合数)
  3. 洛谷P4173:残缺的字符串(FFT、通配符匹配)
  4. 1.14 日志(递推ybtoj)
  5. YbtOJ-毒瘤染色【LCT】
  6. 欢乐纪中某B组赛【2019.1.26】
  7. jzoj1350-游戏(某C组)【SPFA,图,最短路】
  8. Codeforces Round #676 (Div. 2) E待补
  9. 动态规划练习1 [导弹拦截]
  10. Java Jenkins Api