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

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命令模式

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

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

相关文章

抽象类与接口的区别

文章目录抽象类的理解接口的理解区别分析演示案例总结参考抽象类的理解 动物就是对某类事物的普遍性、共同性进行抽取后得到的用来反映这类事物本质的概念。 动物被定义为靠摄取有机物(植物、动物或微生物)来获得营养而不能完成无机物到有机物转化过程的能够对环境…

浅尝硬盘分区表

【0】README 0.1) text description from orange’s implemention of a os; 0.2) there are a number of analysis and attention proves to be essence of this page, I think; 0.3)Conclusion about hd partition table C1…

openjdk-7支持版本_长期支持对OpenJDK意味着什么?

openjdk-7支持版本Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持(LTS)的问题,这表明对它的真正含义仍有一些困惑。 在此博客文章中,我将解释不同部分如何组合在一起。 那么……谁说或在哪里说“ #OpenJDK 11”是LTS&…

android 安装卸载应用提醒_Android监听程序的安装和卸载

在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataStr…

常用函数式接口的学习

文章目录定义常用的函数式接口Supplier演示代码Consumeraccept 方法演示代码andThen 方法演示代码Predicatetest 方法and 方法演示代码or 方法negate 方法Functionapply 方法演示代码andThen 方法演示代码定义 有且仅有一个抽象方法的接口称之为“函数式接口”,但是…

如何创建虚拟硬盘 + os 读取硬盘参数代码

【0】README 0.1) 本文旨在演示如何利用 bximage 创建虚拟硬盘;0.2) 利用 os 读取硬盘参数, source code from orange’s implemention of a os , for complete code , please visit https://github.com/pacosonTang/Orange-s-OS…

内联脚本被视为是有害的_数据类被认为有害

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

win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...

Haley 于2020/08/24更新 磁盘分区管理摘要文中介绍了两种方法充分利用Windows10未分配空间,分别为1)格式化Win10未分配空间来创建新的分区,2)在分区上添加未分配空间。我的Win 10计算机上有一个大小99GB的未分配空间 :「我在Windows计算机上安装了两个硬…

selenium编写脚本_Selenium脚本编写技巧和窍门

selenium编写脚本如果您刚刚开始学习Selenium,则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识,将帮助您记住所有这些。 您只需浏览一次,几秒钟后您便会了解所有内容。 让我们一一看一下所有的技巧和窍门。 …

div和div之间画横线_HTML如何在两个div标签中间画一条竖线

近日在画一个界面的时候,遇到一个需求:在界面当中画一条竖线,且这条竖线在高度上需要自动占满整个父div(即这条竖线的高度和两个div中较高的一个等高)。往常我们画一条横线直接用标签即可,当画一条竖线的时候发现找不到标签。在网…

静态类型/静态分派/动态分派/单分派/多分派

文章目录静态类型/实际类型方法解析静态分派动态单分派参考静态类型/实际类型 Human woman new Woman(); // Human就是静态类型,其实就是变量编译时类型,Woman就是实际类型 Man man new Man(); // 静态类型和实际类型都是Man方法解析 Class 文件的编…

jvm回收垃圾_没有垃圾回收的JVM

jvm回收垃圾JVM社区不断增加新的GC,最近又添加了一个新的GC,它被称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&…

C打印函数printf的一种实现原理简要分析

【0】README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用;0.2) vsprintf 和 printf.c 的源码,参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统:Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具,需要自己安装安装命令:sudo apt install tcpxtract使用方法…

java设计模式适配器模式_Java中的适配器设计模式

java设计模式适配器模式适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。 在设计一个面向对象的应用程序时,当我们的客户期望一个特…

技术路线的选择重要但不具有决定性

微软在技术上连续大动作,如果放在几年前,我相信微软粉丝们一定是欢声雷动,不过这次情况有点不太一样,在网上看到有人在抱怨微软技术更新速度太快而且四面出击,还有人扬言要改弦更张,投奔Linux或者Java阵营。…

nproc是什么意思_top/htop内容的含义

uptimeuptime命令显示了load avg,它其实是读取的/proc/uptime文件:/proc/uptime 文件cat /proc/uptime9592411.58 9566042.33第一个是系统启动了多久(单位s),第二个意思是系统启动以来,cpu idle花费的时间(单位s)。多核机器上&…

进程间通信(IPC)+进程加锁解锁

【0】README 0.1) source code and text description are from orange’s implemention of a os;0.2) for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/ipc_8 【1】看看,我们的进程代…

QA与测试到底有什么区别?

文章目录引言QA与测试的区别?QA、QC、QM的关系与区别?QA工作内容与职责引言 近期微信公众号后台有同学留言问: QA与测试的区别? QA、QC、QM的区别?以及QA的工作内容与职责。 针对这些问题我查阅了一些资料然后结合自…

java 进程运行时间_将Java类作为子进程运行

java 进程运行时间我本周需要将Java类(而不是jar)作为子进程运行。 更确切地说,我想从测试内部产生一个新进程,而不是直接在测试内部(进程内)运行它。 我不认为这是幻想或复杂的事情。 但是,这不…