《Java设计模式及实践》—3.2 命令模式
3.2 命令模式
在面向对象编程当中,一个很重要的事情是设计能够使得代码松耦合。举个例子,我们需要开发一个复杂的程序,用来绘制诸如点、线、线段、圆、矩形等许多图形。
为了让代码能够实现所有种类的形状,我们需要实现很多操作来处理菜单操作。为了让程序可维护,我们需要创建一个统一的方法来定义所有的命令,这样做便能够将所有实现细节隐藏在程序之中(这个程序实际上就是客户端)。
1.目的
命令模式能够做到:
提供一个统一的方法来封装命令和其所需要的参数来执行一个动作。
允许处理命令,例如将命令存储在队列中。
2.实现
如图3-3所示的类图展示了命令模式的实现。
图 3-3
前面的类图中包括以下元素:
Command(命令类):这是表示命令封装的抽象类。它声明了执行的抽象方法,该方法应该由所有具体命令实现。
ConcreteCommand(具体命令类):这是命令类的实际实现。它必须执行命令并处理与每个具体命令相关的参数。它将命令委托给接收者。
Receiver(接收者):这是负责执行与命令关联的操作的类。
Invoker(调用者):这是触发命令的类。通常是外部事件,例如用户操作。
Client(客户端):这是实例化具体命令对象及其接收者的实际类。
最初,我们的想法是在一个大的if-else块中处理所有可能出现的命令:
之后,我们决定为绘图程序应用命令模式。首先创建一个命令接口:
下一步是将所有对象(如菜单项和按钮)定义为类,实现命令接口和execute()方法:
在重复上一个操作并为每个可能的操作创建一个类之后,用以下方法替换前面实现的if-else代码块:
从代码中看到调用者(触发performAction方法的客户端)和接收者(实现命令接口的类)是分离的。我们可以轻松扩展代码而无须更改它。
3.适用情况和示例
命令模式的适用性和示例如下:
Undo/Redo operation(撤销/重做操作):命令模式允许我们将命令对象存储在队列中。这样就可以实现撤销和重做操作。
Composite command(组合命令):复杂命令可以使用组合模式由简单命令组成,并按顺序运行。通过这种方式,我们可以以面向对象的方式构建宏。
The asynchronous method invocation(异步方法调用):命令模式用于多线程应用程序。命令对象可以在后台以单独的线程执行。java.lang.Runnable是一个命令接口。
在以下代码中,Runnable接口充当命令接口,由RunnableThread实现:
客户端调用命令以启动新线程:
- 点赞
- 收藏
- 关注作者
评论(0)