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

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

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

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

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

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

由于每个命令对象都支持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中的命令设计模式相关推荐

  1. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

  2. 如何在Java中解析命令行参数?

    在Java中解析命令行参数的好方法是什么? #1楼 我不建议使用Apache Common CLI库,因为它是非线程安全的. 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuil ...

  3. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  4. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. Java中的Memento设计模式-示例教程

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

  7. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  8. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  9. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

最新文章

  1. 逆序对(树状数组解决)
  2. java ajax返回json数据json对象
  3. SAP Basis: 从SAP GUI杀死进程
  4. SharePoint 2007 用户创建 MySite 过程发生错误一例【已解决】
  5. 理解单例模式、单例类
  6. 时隔500天后,对比Excel系列又一新书发布
  7. POJ3320 Jessica's Reading Problem 尺取法
  8. KMP Trie 例题讲解
  9. chrome自动提交文件_收集文档及提交名单统计
  10. Swing写qq聊天软件(想要QQ表情@我呦)
  11. Linux学习笔记020---CentOs7.3 搭建 Solr单机服务
  12. centos7安装浏览器
  13. java ssdb查询_java连接ssdb数据库
  14. React Native组件(四)TextInput组件解析
  15. beetl java例子_初识Java模板引擎Beetl之简单示例
  16. 初识THINKPHP--关于路径的问题(xampp下的htdocs为根目录)
  17. 百度地图和谷歌地图经纬度互转
  18. 物联网技术-组网技术、应用场景
  19. 改led背光有光斑_为什么把车灯改成LED,效果还不如卤素?
  20. 流利阅读 2019.3.9 Young children should be taught in their mother tongue, not in English

热门文章

  1. P1082-扩欧模板同余方程【扩欧,数论】
  2. 【2018.3.24】模拟赛之三-ssl2547 圆环【数论】
  3. 【做题记录】CF1444A Division
  4. java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)
  5. Spring入门(三)之IoC
  6. hibernate中报错could not initialize proxy - no Session的解决方法
  7. 2020蓝桥杯省赛---java---B---8(走方格)
  8. 如何用xshell上宝塔
  9. linux ssh密钥对,Mac使用ssh密钥登录Linux
  10. 转】Eclipse编辑Spring配置文件xml时自动提示类class包名