设计模式 命令模式 实例_根据您的命令-命令设计模式

设计模式 命令模式 实例

命令设计模式是一种广为人知的设计模式,属于行为设计模式(“四人帮”的一部分)。 顾名思义,它与应用程序中的动作和事件有关。

问题陈述:

假设有一个网页将在其中包含多个菜单的情况。 编写此代码的一种方法是使条件成立,并在每次单击菜单时执行操作。

private void getAction(String action){if(action.equalsIgnoreCase('New')){//Create new file}else if(action.equalsIgnoreCase('Open')){//Open existing file}if(action.equalsIgnoreCase('Print')){//Print the file}if(action.equalsIgnoreCase('Exit')){//get out of the application}}

我们必须根据操作字符串执行操作。 然而,以上代码如果条件太多,则无法扩展。

意图:

  • 动作的请求者需要与执行该动作的对象分离。
  • 允许将请求封装为对象。 注意这一行,因为这对于命令模式是非常重要的概念。
  • 允许将请求存储在队列中,即允许您存储稍后可以执行的操作列表。


解:

要解决上述问题,可以在此处恢复命令模式。 如上所述,命令模式通过封装将上述动作移至对象。 这些对象在执行时将执行命令。 在这里,每个命令都是一个对象。 因此,我们将必须为每个菜单操作(例如NewClassOpenClassPrintClassExitClass)创建单独的类。 所有这些类都继承自父接口(即Command接口)。 此接口(命令接口)抽象/包装所有子动作类。
现在,我们介​​绍一个Invoker类,其主要工作是将操作与具有该操作的类进行映射。 它基本上保留了该动作,并通过调用execute()方法获得执行请求的命令。
糟糕! 我们在这里错过了另一个利益相关者。 这是Receiver类。 接收器类具有执行操作的知识。 接收者具有执行动作时该做什么的知识。

结构体:

以下是“命令设计”模式的参与者:

  • 命令–这是用于执行操作的接口。
  • ConcreteCommand –此类扩展了Command接口并实现了execute方法。 此类在操作和接收者之间创建绑定。
  • 客户端–此类创建ConcreteCommand类并将其与接收者相关联。
  • 调用程序–此类要求命令执行请求。
  • 接收器–此类知道要执行的操作。


范例



脚步:

  1. 使用诸如execute()之类的方法签名定义Command接口。 在上面的示例中, ActionListenerCommand是具有单个execute()方法的命令界面。
  2. 创建一个或多个派生类,这些派生类封装以下内容的一些子集:“接收者”对象,要调用的方法,要传递的参数。 在上面的示例中, ActionOpenActionSave是Concrete命令类,它们在接收方和操作之间创建绑定。 ActionOpen类在execute()内调用接收方(在本例中为Document类)类的action方法。 因此,命令接收器类需要做什么。
  3. 为每个延迟的执行请求实例化Command对象。
  4. 将Command对象从创建者传递到调用者。
  5. 调用者决定何时执行()。
  6. 客户端实例化Receiver对象(Document)和Command对象,并允许调用者调用命令。


代码示例:

命令界面:

public interface ActionListenerCommand {public void execute();
}

接收器类别:

public class Document {public void Open(){System.out.println('Document Opened');}public void Save(){System.out.println('Document Saved');}
}

具体命令:

public class ActionOpen implements ActionListenerCommand {private Document adoc;public ActionOpen(Document doc) {this.adoc = doc;}@Overridepublic void execute() {adoc.Open();}
}

祈求者等级:

public class MenuOptions {private ActionListenerCommand openCommand;private ActionListenerCommand saveCommand;public MenuOptions(ActionListenerCommand open, ActionListenerCommand save) {this.openCommand = open;this.saveCommand = save;}
public void clickOpen(){openCommand.execute();
}
public void clickSave(){saveCommand.execute();
}
}

客户类别

public class Client {public static void main(String[] args) {Document doc = new Document();ActionListenerCommand clickOpen = new ActionOpen(doc);ActionListenerCommand clickSave = new ActionSave(doc);MenuOptions menu = new MenuOptions(clickOpen, clickSave);menu.clickOpen();menu.clickSave();}}


优点:

命令模式有助于解耦调用方和接收方。 接收者是知道如何执行动作的人。
命令应能够执行撤消和重做操作。
这种模式在可扩展性方面有所帮助,因为我们可以在不更改现有代码的情况下添加新命令。

退税:

命令模式的主要缺点是每个单独命令的类数增加。 这些项目也可以通过方法实现来完成。 但是,命令模式类比使用if else条件创建多个方法更具可读性。

有趣的一点:

  • java.lang.Runnable和javax.swing.Action的实现遵循命令设计模式。
  • 命令可以使用Memento维护撤消操作所需的状态。


下载示例代码:

Download Sample Code

参考: 通过您的命令从我们JCG伙伴 Mainak哥斯瓦米在Idiotechie博客。

翻译自: https://www.javacodegeeks.com/2012/11/by-your-command-command-design-pattern.html

设计模式 命令模式 实例

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

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

相关文章

Linux(CentOS)挂载U盘、移动硬盘以及文件拷贝、备份

说明: 环境:VMware workstation 系统:centos6.2 以下操作均在root下执行的 1.U盘挂载 mkdir /mnt/usb //创建一个目录,用于挂载U盘 fdisk -l //查看系统中挂载的U盘,若系统有一块硬盘sdb1 代表你的U盘,…

iservice封装有哪些方法_5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?

5w大功率led,5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?5w大功率led,5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?5w大功率led灯珠今天上午,一位台湾高雄的客户咨询定做5W大功率LED灯…

Java EE调度程序

Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库。 Java EE 6和7完整配置文件中提供的Java EE 6计时器服务为我们提供了许多选项来定义调度间隔,以及如果停止并…

Simulink工作区无法保存To workspace模块的数据解决办法

1.首先要搞清楚Workspace概念。包括基本工作区(base workspace)和函数工作区。默认条件下在命令窗口中输入命令使用的是base workspace,但对于每个函数,都有自己独立的工作区。 2.GUI回调函数作为function有独立的工作区。 3.使…

对KVM虚拟机进行cpu pinning配置的方法

这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下首先需求了解基本的信息1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 #virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 M…

1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人

昨天CBA常规赛第26轮:山东西王89-86北京首钢。上半场,双方打得非常激烈,比分交替领先。第3节北京抓住机会,顺势拉开比分(68-57)。李慕豪接方硕助攻,轻松扣篮得分。首钢替补席一片欢声笑语,方巨头和翟晓川笑…

redhat/centos 搭建svn服务器环境

subversion支持3种服务配置1、apache mod_dav_svn2、svnserve 3、穿越ssh隧道的svnserve教程选择的是最简单的svnserve的服务1、安装svnservyum install subversion2、建立一个仓库 respository$ mkdir /home/svn$ mkdir /home/code$ svnadmin create /home/svn/repository3、…

win10插入耳机没声音解决办法

之前重装了win10系统,装完系统后,发现插入耳机没有声音,非常令人难受!经过一番探索,终于解决了这个问题,在此与大家分享。 1.点击左下角搜索框,输入控制面板,点击enter打开 2.打开…

js如何获取服务器端时间?

用js做时间校正,获取本机时间,是存在bug的。 使用js也可获取到服务器时间,原理是使用 ajax请求,返回的头部信息就含有服务器端的时间信息,获取到就可以了。以下: 1、依赖jQuery 代码: function …

java 堆转储快照_Java堆转储:您可以完成任务吗?

java 堆转储快照如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜。 如果是这样,那么好消息是您将有机会增加您的Java故障排除技能和JVM知识。 JVM现在已经发展到这样的程度:与旧的JDK 1.0 – JDK 1.4天相比&#xf…

电池供电的电容麦_太阳能航空障碍灯供电机制设计

南京徐航航空设备有限公司是以产销GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯,GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯等方面产品获得民航认证航空障碍灯品牌,是…

simulink如何从goto模块快速找到相应的from模块

有时候,Simulink搭建的模型中模块过多,很难找到goto模块所对应的from模块。下面将举例说明如何从goto模块快速找到相应的from模块。 方法1 双击goto模块会弹出下图图框,点击图框的链接即可找到对应的from模块。如下图所示。 对应的from模块…

aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球

我朋友汪伦。最近在计划出国旅游,我问他都准备了啥,他说根据网上的攻略,带了现金泡面老干妈还有一万个充电宝。现金我懂,国外还没普及扫码支付;泡面是怕外国菜吃不惯;老干妈是夹汉堡吃的;一万个…

11 字节码执行

转载于:https://www.cnblogs.com/likevin/p/10183151.html

在Junit上使用Kafka

除了在原始Kafka Producer和Consumer上更易于使用的抽象之外,优秀的Spring Kafka项目提供的简洁功能之一是在测试中使用Kafka的方法。 它通过提供可轻松设置和拆卸的Kafka嵌入式版本来实现此目的。 一个项目需要包括此支持的全部就是“ spring-kafka-test”模块&am…

补码原理一个字节存储数值的范围如何计算

为什么二进制负数在计算机中的存储需要使用补码?一个字节存储数值范围为什么是-128~127?下面我们开始学习。 1.了解补码 什么是原码、反码和补码?负数在计算机中的二进制表示是怎样的?(戳这里查看) 2.补…

laravel API开发,使用dingo/api

1、composer添加 "dingo/api": "1.0.*dev" composer require dingo/api:1.0.xdev2、配置文件app.php添加注册 Dingo\Api\Provider\LaravelServiceProvider::class,3、添加自定义配置(此时会在配置文件中生成api.php) php artisan ve…

【SVN】代码提交备注规范

一、格式 <type>: <subject> 例如 fix&#xff1a;解决用户点击登录无响应的问题 二、详细说明 1、type &#xff1a;用于说明提交类型 feat - 增加新功能、新需求 fix - 修复bug, 可以是测试发现的bug, 也可以是研发自己发现的bug style - 不影响…

StarUML使用说明-指导手册

StarUML使用说明-指导手册 原著&#xff1a;Stephen Wong 翻译&#xff1a;火猴 1.综述 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具。这是一个用Java语言描述的创建类图的简明手册。 StarUML(简称SU)&#xff0c;是一种创建UML类图&#x…

elif else if oracle_关于Oracle if elsif else

昨天被一同事问一问题&#xff0c;问题就是Oracle存储过程中的IF逻辑块告诉他大概是这样&#xff1a;create or replace procedure testIfElsif (numb number) ISbeginif numb 1 thenDBMS_OUTPUT.put_line(1);else if numb 2 thenDBMS_OUTPUT.put_line(2);elseDBMS_OUTPUT.pu…