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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光纤收发器怎么连接?

我们想要上网,就必须连接网络,而日常生活当中我们最常使用的网络就是宽带,连接宽带需要通过网线进行连接,但是网线在传输数据时它有一定的局限性,它的传输距离很小,一般情况下网线的传输距离仅仅只有100米&…

光纤收发器常见六大故障,三分钟全部搞定

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,如:监控安…

光纤收发器出现死机故障怎么解决

众所周知,光纤收发器是一种将双绞线电信号和光纤的光信号进行互换的以太网传输设备,因此也被称为光电转换器。使用光纤收发器可以将网络的传输距离延伸到100公里以上。相信大家在光纤收发器使用过程中,有时候会遇到一些问题的,最近进碰到有用…

数据类被认为有害

这篇博客文章解释了从我参与的项目之一中删除Lombok项目的动机。 它反映了我的个人观点,并不妨碍特定的技术。 大约三年前,我认识了Project Lombok ,这是一个添加Java代码的库。 我从一开始就喜欢它,因为它贡献了很多有用的功能。…

光纤收发器测试方法大全

光纤收发器产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽带城域网的接入层应用;如:监控安全工程的高清视频图像传输。我们在使用光纤收发器的过程中,不可避免的会遇到一些问题&a…

Spring Boot:构建一个RESTful Web应用程序

介绍: REST代表表示状态传输 ,是API设计的体系结构指南。 我们假设您已经具有构建RESTful API的背景。 在本教程中,我们将设计一个简单的Spring Boot RESTful Web应用程序,公开一些REST端点。 项目设置: 让我们首先通…

光纤收发器具体是怎么分类的?

现如今,随着光纤收发器产品的多样化发展,其分类方法也各异,但各种分类方法之间又有着一定的关联,那么,光纤收发器具体是怎么分类的呢?接下来就由杭州飞畅地 小编来为大家详细介绍下吧! 按速率来…

光纤收发器的分类介绍

现如今,国外和国内生产光纤收发器的厂商很多,产品线也极为丰富,主要有深圳三旺通信、光路科技、瑞斯康达、烽火、飞畅、博威、德胜、Netlink、迅捷、腾达等。时下由于国内各大运营商正在大力建设小区网、校园网和企业网,因此光纤收…

java 编译 器 ide_在没有IDE的情况下编译和运行Java

java 编译 器 ide最近一个名为“ 不使用IDE编译Java软件包 ”的Java subreddit线程提出了一个问题:“是否有一个命令将软件包内的一组Java文件编译到一个单独的文件夹中(以下简称为bin),以及如何我会去运行新的类文件吗&#xff1…

光纤收发器的工作原理以及使用方法

关于光纤收发器的工作原理以及使用方法这块,在这里飞畅科技的小编做了专门的整理,首先,我们来了解下什么是光纤收发器,光纤收发器是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很…

Spring Boot登录选项快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在本文中,您将研究使用Spring Boot 2.1实现登录功能的各种选项。 您将从最…

光纤收发器的故障处理

在之前,我们详细地介绍了光纤收发器的分类,我们了解到光纤收发器有单模、多模之分,单纤多纤之分,但是不管光纤收发器是怎么分类的,其故障的判断方法基本是一样的,总结起来光纤收发器所会出现的故障有&#…

光纤收发器怎么使用?

在网络建设及应用中,由于网线最大的传输距离一般为100米,因此布建远距离传输网络的时候不得不使用光纤收发器等中继设备。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中。那么,光纤收发器该如何使用呢…

光纤收发器通常具有哪些特点?

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器,其产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽…

光纤收发器的实际应用范围介绍

众所周知,光纤收发器的有很多不同的分类,种类很多,在实际使用中大多注意的是按光纤接头不同而区分的类别:SC接头光纤收发器和FC/ST接头光纤收发器。接下来小编就来为大家介绍下光纤收发器的具体应用范围有哪些,想要了解…

光纤收发器的优势介绍

提到光纤收发器,人们常常不免会将光纤收发器与带光口的交换机来进行比较,下面咱们就主要来谈一下光纤收发器相对于光口交换机的优势。想要了解的朋友就一起来看看吧! 首先,光纤收发器和普通交换机在价格上远远比光口交换机便宜&a…

Selenium脚本编写技巧和窍门

如果您刚刚开始学习硒,则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识,将帮助您记住所有这些。 您只需浏览一下它们,几秒钟后您就会了解所有内容。 让我们一一看一下所有的技巧和窍门。 创建Webdriver实例…

光纤收发器在使用过程中有哪些需要注意的事项?

光纤收发器的种类非常丰富,而在实际使用中大多是按照光纤接头不同进行区分,SC接头光纤收发器和FC/ST接头光纤收发器。今天,飞畅科技的小编就带大家来详细了解下光纤收发器在使用过程中需要注意的事项有哪些?一起来看看吧&#xff…

[渝粤教育] 南通大学 电路分析 参考 资料

教育 -电路分析-章节资料考试资料-南通大学【】 随堂测验:关联方向和非关联方向判断 1、【填空题】图中所示的电压源电压、电流i参考方向为 方向,电流源电压u、电流i参考方向为 方向。 A、 参考资料【 】 随堂测验:电源功率计算及判断 1、【填…

光纤收发器和协议转换器之间有哪些区别?

在通信网络领域,我们经常会用到光纤收发器和协议转换器,但对此不是很了解的朋友,往往可能会将二者搞混淆。那么,关于光纤收发器与协议转换器之间有什么区别呢?接下来就跟随杭州飞畅的小编一起来看看吧! 光…