首页 > 其他 > 详细

命令模式

时间:2014-02-25 10:44:14      阅读:304      评论:0      收藏:0      [点我收藏+]

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

  通过封装方法调用,我们可以把运算块包装成形。所以调用此运算的对象不需要关心事情是如何进行的,只需要知道如何使用包装成形的方法来完成它就可以了。

  一个命令对象(如下文的LightOnCommand)通过在特定的接收者(Light)上绑定一组动作(On())来封装一个请求,要达到这一点,命令对象将动作和接收者包进对象中。这个对象只暴露一个类似Excute()的方法,当此方法被调用时,接收者就会执行这些动作。

  接收者存在的必要性(解耦):一般来说,我们尽量设计“傻瓜”命令对象,它只知道调用一个接收者的行为。然而许多“聪明”的命令对象会实现许多逻辑,直接完成一个请求,这样一来,调用者和接收者之间的解耦程度比不上“傻瓜”命令对象。

  代码示例:

1.实现命令接口

public interface Command

{

  public void Excute();

}

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

public class LightOnCommand implements Command

{

  Light light;

  public LightOnCommand(Light light)

  {

    this.light = light;    // 构造器传入某个电灯,以便让这个命令对象控制,然后记录在实例变量中。

              // 一旦调用Excute()方法,这个电灯对象就会成为接收者,负责接收请求。

  }

  public void Excute()

  {

    light.On();             // 命令对象调用接收者(light)的方法。

  }

}

3.使用LightOnCommand类

public class SimpleRemoteControl          // 简易遥控器

{

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

  public SimpleRemoteControl() {}

  public void SetCommand(Command command)

  {

    slot = command;                      // 设置插槽控制命令,客户可以调用该方法设置遥控器的行为

  }

  public void buttonWasPressed()

  {

    slot.Excute();                           // 当按下遥控器按钮,当前命令衔接插槽,并调用Excute()方法

                      // 从该方法也可以看出

                      // 发出请求的对象(SimpleRemoteControl)与接收与执行这些请求的对象(Light)

                      // 之间的解耦关系    

  }

}

命令模式

原文:http://www.cnblogs.com/hachun/p/3564411.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!