Command Pattern(命令模式)
定义:
将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排队,记录请求日志,并且支持撤销操作。(来自:《深入浅出设计模式》莫勇腾)
应用情景:
- 当你需要与动作有关的对象来作为参数。
- 你需要在不同的时间创建请求,生成请求队列,执行请求。
- 你需要支持取消、保存修改日志或处理事务(事务包括大量修改的数据)功能。
- 你需要支持宏命令。
前奏
我举个例子,假设天暗下来了,那么通常情况下,我们要开电灯,日光灯,台灯等,假设一盏灯对应一个开关,总共开5盏灯,那么我们要按五个开关,通常情况下,如果灯一多起来,那么人就会感觉很费劲,设计程序时,我们这样设计,人作为一个打开开关的类,每一盏灯作为一个类,那么通常我们会new 五个灯的类,然后用一个方法turnLightOn()来打开所有的灯,
如下

![]()
事实上,如果我们再增加一盏灯的话,Person类必须修改,方法也得修改,而且也会使得Person类越来越庞大,而设计模式的思想告诉我们必须保护起变化来,我们引入一个中间类,Command,把所有的命令放入到里边,如下列UML图:

package lights.lights;
/***********************************************************************
* Module: Person.java
* Author: hongqin
* Purpose: Defines the Class Person
***********************************************************************/
import java.util.*;
/** @pdOid e48e5f4c-fa8c-4d2f-95e9-5739f160120a */
public class Person {
public List<Command> commandList;
public Person() {
commandList = new ArrayList<Command>();
}
public int turnLightOn() {
Command[] commands = (Command[])commandList.toArray();
for (Command command : commands) {
command.execute();
}
return 0;
}
/** @pdGenerated default add
* @param newCommand */
public void addCommand(Command newCommand) {
if (!this.commandList.contains(newCommand))
this.commandList.add(newCommand);
}
/** @pdGenerated default remove
* @param oldCommand */
public void removeCommand(Command oldCommand) {
if (oldCommand == null)
return;
if (this.commandList != null)
if (this.commandList.contains(oldCommand))
this.commandList.remove(oldCommand);
}
}
实例:

注:司机不必关注加速的细节,只需要发出一个命令即可实现加减速。命令可以是连续的(队列操作),重复的,可撤销的操作。
注:
- 定义以及应用场景来自《深入浅出设计模式》莫勇腾
- UML软件:PowerDesigner12.5

- 大小: 7.8 KB

- 大小: 3.8 KB

- 大小: 7.6 KB
分享到:
相关推荐
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...
命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...
用最简单的例子理解命令模式(Command Pattern) 命令模式的需求源自想通过一个指令(比如这里IControl的Execute方法)来控制多个类的多个方法,包含了几个要素: 1、命令:让类的各种方法抽象成类实现一个接口 2、...
### 命令模式(Command Pattern) #### 概述 命令模式是一种行为设计模式,它将请求封装成对象,以便使用不同的请求对客户端进行参数化。该模式有助于将发送请求的对象与执行请求的对象解耦。 #### 核心概念 在...
通过命令模式,我们可以轻松地添加新的命令,只需创建新的具体命令类并实现`Command`接口即可。此外,由于命令对象存储了接收者,所以可以很容易地在不同上下文中重用命令,甚至可以在命令执行后撤销操作(通过保存...
**命令模式(Command Pattern)**是一种行为型设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在命令模式中,请求是以命令的形式...
总结来说,"CommandPattern)管理智能家电最终代码共4页.pdf.zip"提供的示例应该展示了如何利用命令模式来管理和控制智能家电系统,包括命令的创建、执行、撤销以及如何将这些概念融入到实际的软件设计中。...
**命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在这个场景中,我们关注的是如何利用命令模式...
**命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和...
在提供的文件列表中,`Program.cs`通常是主程序入口,`TestPatternCommand.csproj`是项目文件,`CommandPattern`可能是包含命令模式相关类的文件夹,`Properties`包含了项目的配置信息,而`TestPatternCommand.sln`...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象(调用者)与...
命令模式是一种设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列请求、或者记录请求日志,也可以支持可撤销的操作。在C#中,命令模式的应用可以帮助我们更好地解耦系统中的调用者和接收者,提高...
- `CommandPattern` 文件夹:可能包含了命令模式相关的类,如Command接口、ConcreteCommand类等。 - `Properties` 文件夹:存储项目的属性配置,如AssemblyInfo.cs,用于定义元数据。 在实际应用中,C#命令模式可能...
在`CommandPattern.zip`文件中,可能包含了这个模式的示例代码,你可以进一步查看和学习这些代码,以便更好地理解和应用命令模式。记住,虽然这是一个简单的实现,但命令模式的威力在于其能够适应复杂的需求,例如在...
工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...
12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN ...
CommandPattern 命令模式 Memento 备忘录模式 行为型模式end 创建型模式start 共五种,我把抽象工厂和工厂模式合在一起了 BuildPattern 建造者模式 Factory 工厂模式 Prototype 原型模式 ...
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种...[GOF《设计模式》]Command模式结构图如下:图1Command模式结构图Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。
命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装为一个对象,从而使不同的请求可以使用不同的参数进行参数化,队列或日志请求,以及支持可撤销的操作。在 Java 中,命令模式的实现通常涉及一个...