《Java设计模式及实践》—3.2 命令模式

举报
华章计算机 发表于 2019/07/22 13:16:23 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第3章,第3.2节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

3.2 命令模式

在面向对象编程当中,一个很重要的事情是设计能够使得代码松耦合。举个例子,我们需要开发一个复杂的程序,用来绘制诸如点、线、线段、圆、矩形等许多图形。

为了让代码能够实现所有种类的形状,我们需要实现很多操作来处理菜单操作。为了让程序可维护,我们需要创建一个统一的方法来定义所有的命令,这样做便能够将所有实现细节隐藏在程序之中(这个程序实际上就是客户端)。

1.目的

命令模式能够做到:

  • 提供一个统一的方法来封装命令和其所需要的参数来执行一个动作。

  • 允许处理命令,例如将命令存储在队列中。

2.实现

如图3-3所示的类图展示了命令模式的实现。

 image.png

图 3-3

前面的类图中包括以下元素:

  • Command(命令类):这是表示命令封装的抽象类。它声明了执行的抽象方法,该方法应该由所有具体命令实现。

  • ConcreteCommand(具体命令类):这是命令类的实际实现。它必须执行命令并处理与每个具体命令相关的参数。它将命令委托给接收者。

  • Receiver(接收者):这是负责执行与命令关联的操作的类。

  • Invoker(调用者):这是触发命令的类。通常是外部事件,例如用户操作。

  • Client(客户端):这是实例化具体命令对象及其接收者的实际类。

最初,我们的想法是在一个大的if-else块中处理所有可能出现的命令:

 image.png

之后,我们决定为绘图程序应用命令模式。首先创建一个命令接口:

 image.png

下一步是将所有对象(如菜单项和按钮)定义为类,实现命令接口和execute()方法:

 image.png

在重复上一个操作并为每个可能的操作创建一个类之后,用以下方法替换前面实现的if-else代码块:

 image.png

从代码中看到调用者(触发performAction方法的客户端)和接收者(实现命令接口的类)是分离的。我们可以轻松扩展代码而无须更改它。

3.适用情况和示例

命令模式的适用性和示例如下:

  • Undo/Redo operation(撤销/重做操作):命令模式允许我们将命令对象存储在队列中。这样就可以实现撤销和重做操作。

  • Composite command(组合命令):复杂命令可以使用组合模式由简单命令组成,并按顺序运行。通过这种方式,我们可以以面向对象的方式构建宏。

  • The asynchronous method invocation(异步方法调用):命令模式用于多线程应用程序。命令对象可以在后台以单独的线程执行。java.lang.Runnable是一个命令接口。

在以下代码中,Runnable接口充当命令接口,由RunnableThread实现:

 image.png

客户端调用命令以启动新线程:

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200