根据您的命令-命令设计模式

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

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

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 Goswami的命令 ,位于Idiotechie博客上。

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

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

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

相关文章

用js和jQuery做轮播图

Javascript或jQuery做轮播图 css样式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:relative; }.images{position:relative;width: 100%;height: 400px; } .images img{position:absolute;left: 0;top: 0;width: 100%;height: 400px;opacity: 0;fi…

w3school前端教程合集

有关前端开发的w3c教程合集。 http://caibaojian.com/w3school/ 地图ajax教程Canvas教程CSS教程CSS3教程CSS3选择器CSS参考手册DHTML教程HTML教程HTML5教程HTML5音频教程HTML DOM教程JavaScript教程jQuery教程jQuery Ajax教程jQuery事件jQuery操作jQuery选择器jQuery遍历json教…

【开发调试】谷歌浏览器中调试移动网页和测试网速下页面效果

、 今天有幸给大家分享一下谷歌浏览器针对移动网页测试的技巧&#xff0c;主要是最近做个微信公共号网站。所以就要对页面测试拉。移动网页我们最长测得就是各种手机大小的页面效果和出现网络问题的效果展示。 今天就简单分享下在谷歌浏览器测试页面的适配和网速限制展示。…

拼多多分享好友砍价Java实现_拼多多砍价怎么分享到朋友圈 砍价发到微信朋友圈方法...

拼多多是一款电商社交的共享式购物平台&#xff0c;现在还推出了砍价的活动&#xff0c;只要邀请好友砍价&#xff0c;你就以最低的价格购买商品&#xff0c;还可以可能是免费拿到&#xff0c;那么今天小编就给大家讲讲如何将自己的砍价信息分享到微信朋友圈。首先下载手机拼多…

通过6个简单的步骤在Windows上运行Apache Hive

注意 &#xff1a;您需要安装cygwin才能运行本教程&#xff0c;因为Hadoop&#xff08;Hive需要&#xff09;需要cygwin才能在Windows上运行。 至少&#xff0c;系统中必须存在Basic&#xff0c;Net&#xff08;OpenSSH&#xff0c;tcp_wrapper软件包&#xff09;和与安全相关的…

vim编辑器初级(八)

:abbreviate  后面接一个缩写&#xff0c;再接这个缩写的全写&#xff0c;这样在输入这个缩写后&#xff0c;vim会自动将其展开为它的全写 :abbreviate  列出目前你所设置的所有缩写 :map  后面接一个字符串&#xff0c;再接这个字符串所映射的一串命令&#xff0c;这样在…

java多文件post请求_如何使用Java发出多部分/表单数据POST请求?

我们使用HttpClient 4.x创建多部分文件post。更新&#xff1a;截至HttpClient 4.3&#xff0c;一些类已被弃用。下面是新API的代码&#xff1a;CloseableHttpClient httpClient HttpClients.createDefault();HttpPost uploadFile new HttpPost("...");MultipartEnt…

vue 环境的搭建及初始化项目

其实超级简单&#xff0c;虽然网上很多&#xff0c;但是我顺便记录下相当于做笔记吧 1nodejs 的安装&#xff0c; 在node官网下载&#xff0c;点击安装&#xff0c;安装的时候最好选择路径在d盘 2设置环境变量 我的电脑-->属性-->系统环境变量- 系统变量新增一个NODE…

Java堆转储:您可以完成任务吗?

如果您像我一样对Java性能充满热情&#xff0c;那么堆转储分析对您来说应该不是一个谜。 如果是这样&#xff0c;那么好消息是您将有机会提高您的Java故障诊断技能和JVM知识。 JVM现已发展到今天&#xff0c;与旧的JDK 1.0 – JDK 1.4天相比&#xff0c;今天生成和分析JVM堆转…

MariaDB配置、集群

MariaDB在centos 7.3的安装&#xff0c;配置和集群搭配 阿里云最新选配系统中&#xff0c;只有centos7.3可选&#xff0c;因此&#xff0c;基于centos 7的MariaDB的安装&#xff0c;配置。。。 全部删除MySQL/MariaDB MySQL 已经不再包含在 CentOS 7 的源中&#xff0c;而改用了…

java 调用 ictclas50_1-Ictclas50分词系统ForJava

Ictclas50是一个分词库&#xff0c;我嘛主要用来做中文分词&#xff0c;其也能分出词性等东西。1.环境搭建进入到下载页面进行下载&#xff1a;如下图&#xff1a; 因为我的系统是64位的windows&#xff0c;所以选择了到数第三行进行下载。其JAVA版本是通过JNI去调用dll库&…

SpringMVC乱码或前台乱码解决办法

JSP页面乱码 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> 以及 form表单提交方式为必须为post 修改web.xml&#xff0c;增加编码过滤器&#xff0c;如下&#xff08;注意&#xff0c;需要设置forceEncoding参数值…

Beam概念学习系列之Pipeline Runners

不多说&#xff0c;直接上干货&#xff01; https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上运行引擎会根据你选择的分布式处理引擎&#xff0c;其中兼容的 API 转换你的 Beam 程序应用&#xff0c;让你的 Beam 应用程序可以有效的运行在指定的分布式处理引…

使普通的旧Java OSGi兼容

尽管OSGi在Java世界中越来越流行&#xff0c;但仍有许多Java应用程序和库尚未设计成可在OSGi中使用。 有时您可能需要在OSGi环境中运行这样的代码&#xff0c;或者是因为您想利用OSGi本身提供的好处&#xff0c;或者因为您需要仅由该特定环境提供的某些功能。 通常&#xff0c;…

运行 java classnotfound_JAR运行出现ClassNotFoundException异常的解决办法

2009年10月30日最近在弄个聊天室,由于要跟数据库通信,用到了JDBC的3个jar,在eclipse里OK的,但布置到服务器坏事了,不知道怎么弄JDBC的3个jar了写个autoStart.batjava -jar chatServer.jarpause运行报错:F:\mydocuments\java project\socketTest\release>java -jar chatServe…

idea 创建多模块依赖Maven项目

转载地址&#xff1a; http://www.cnblogs.com/tibit/p/6185704.html idea 创建多模块依赖Maven项目 本来网上的教程还算多&#xff0c;但是本着自己有的才是自己的原则&#xff0c;还是自己写一份的好&#xff0c;虽然可能自己也不会真的用得着。 1. 创建一个新maven项目 2.…

移动端适配问题

适配问题 怎么适配iphone6 1px问题 为什么页面与设计稿会出现偏差&#xff1f; dpr设备像素/ css像素&#xff0c;只有dpr等于1的时候&#xff0c;实际效果和设计稿的尺寸比例才是1:1。因为iPhone6的DPR&#xff08;设备像素比&#xff09;为2&#xff0c;设备像素为750&…

用Java弹出创建新的消息通知

首先创建JFrame作为弹出窗口。 在其中添加一些JLabel以包含信息&#xff0c;并在适当的位置分配它们&#xff0c;使其看起来像一条通知消息。 下面给出了示例代码&#xff1a; String message You got a new notification message. Isnt it awesome to have such a notificat…

mysql游标表间数据迁移_FalseMySQL存储过程--gt;通过游标遍历和异常处理迁移数据到历史表-mysql-第二电脑网...

-- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟&#xff0c;迁移旧数据到历史表。DELIMITER $$USE dbx$$电脑技术网对《FalseMySQL存储过程-->通过游标遍历和异常处理迁移数据到历史表》总结来说&#xff0c;为我们程序员很实用。DROP PROCEDURE IF EXISTS pro_x…

课后作业-阅读任务-阅读笔记-2

好的单元测试的标准&#xff1a; 1>单元测试应该在最基本的功能/参数上验证程序的正确性 2>单元测试必须由最熟悉代码的人&#xff08;程序的作者&#xff09;来写 3>单元测试后&#xff0c;机器状态保持不变 4>单元测试要快&#xff08;一个测试的运行时间是几秒钟…