从命令模式(Command)看编程

发表于:2013-09-01来源:Csdn作者:shuangde800点击数: 标签:命令模式
从命令模式(Command)看编程 走进命令模式 在餐厅的情境中,我们看看餐厅是怎样工作的: 1、顾客走进餐厅,点好菜后,生成订单交给女服务员。

  走进命令模式

  在餐厅的情境中,我们看看餐厅是怎样工作的:

  1、顾客走进餐厅,点好菜后,生成订单交给女服务员。

  2、女服务员把订单拿到厨房工作室,大喊一声:“订单来了!”

  3、厨师订单准备餐点。

  上面情境各角色职责:

  1、订单封装了顾客的请求。 和一般的对象一样,订单可以被传递,订单内包含一个方法 orderUp(), 这个方法封装了准备餐点所需的动作。订单内有厨师的引用。这些都被封装起来。

  2、女服务员的工作就是接受订单,然后调用订单的orderUp( )方法。这里的orderUp具体内容就是把订单交给厨师。

  女服务员不必知道订单的内容是什么,只需要知道订单中有一个orderUp( )的方法可以调用就够了。

  3、厨师具备准备餐点的知识

  厨师是一种对象,他真正知道如何准备餐点。一旦女服务员调用orderUp( )方法,厨师就接手马上做好餐点。

  女服务员和厨师之间的关系是彻底解耦的,请注意,女服务员的订单封装了餐点的细节,她只要调用订单的方法即可,而厨师看了订单就知道该做什么餐点,厨师和女服务员之间从来不用直接沟通。

  从餐厅到命令模式

  把餐厅想象成OO设计模式中的一种模型,这个模型允许将“发出的请求的对象”和“接受与执行这些请求的对象”分隔开来。

  比方说,对于遥控器的例子:

  有一个遥控器

  上面有不同功能的卡槽,旁边对应卡槽的开关按钮,遥控器厂商提供了相关卡槽功能的类。如何设计这个遥控器的API?

  对于遥控器API,我们需要分隔开“发出请求的的按钮代码”和执行请求的"厂商特定对象"。

  假设遥控器插槽上有一个餐厅订单的对象,那么按按钮,就会调用该对象的orderUp()方法,然后就可以等待大餐上来了!

  命令模式可以将“动作的请求者”从动作的执行者对象中解耦。上面遥控器是请求者,而执行者对象就是厂商类的其中之一的实例。

  利用命令模式把遥控器每个键的请求封装成一个特定对象,所以,每个按钮都存储一个命令对象,那么当按下按钮时,就可以请命令对象做相关的工作。遥控器并不需要知道工作内容是什么,只要有这个命令对象就能和正确的对象沟通,把事情做好就可以了。

  第一个命令对象

  下面用命令模式实现遥控器的代码

  1. 实现命令接口

  [java] view plaincopy// 命令接口,所有的命令对象实现这个接口

  public interface Command {

  // 简单! 只需要一个方法:execute()

  public void execute();

  }

  2. 实现一个打开电灯的命令

  [java] view plaincopy// 实现一个打开电灯的命令

  // 要实现Command的接口

  public class LightOnCommand implements Command{

  Light light;

  // light是接收者

  public LightOnCommand(Light light) {

  this.light = light;

  }

  // 执行接收者的动作

  public void execute() {

  light.on();

  }

  }

  3. 使用命令对象

  下面是调用者

  [java] view plaincopypublic class SimpleRemoteControl{

  // 有一个插槽持有命令,而这个命令控制着一个装置

  Command slot;

  public SimpleRemoteControl() { }

  // 这个方法用来设置插槽控制的命令。

  // 如果这段代码的客户想要改变

  public void setCommand(Command command) {

  slot = command;

  }

  // 当按下按钮时,这个方法就会被调用

  // 使得当前命令衔接插槽,并调用他的execute()方法

  public void buttonWasPressed() {

  slot.execute();

  }

  }

  4. 遥控器使用的简单测试

  下面代码,用来测试上面的简单遥控器

  [java] view plaincopypublic class RemoteControlTest {//这是命令模式的客户

  public static void main(String[] args) {

  // 遥控器就是调用者,会传入一个命令对象,可以用来发出请求

  SimpleRemoteControl remote = new SimpleRemoteControl();

  // 创建一个电灯对象,此对象是接收者

  Light light = new Light();

  // 这里创建一个命令,然后接收者传给他

  LightOnCommand lightOn = new LightOnCommand(light);

  // 把命令传给调用者

  remote.setCommand(lightOn);

  // 模拟按下按钮

  remote.buttonWasPressed();

  }

  }

  定义命令模式

  命令模式将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作

原文转自:http://blog.csdn.net/shuangde800/article/details/9840259