java命令模式

来源:互联网 发布:云计算产业的盈利模式 编辑:程序博客网 时间:2024/05/22 22:34

命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式包含如下角色:

  • Command: 抽象命令类
  • ConcreteCommand: 具体命令类
  • Invoker: 调用者
  • Receiver: 接收者
  • Client:客户类


代码

import java.util.List;import java.util.ArrayList;/* The Command interface */public interface Command {   void execute();}/* The Invoker class */public class Switch {   private List<Command> history = new ArrayList<Command>();   public Switch() {   }   public void storeAndExecute(Command cmd) {      this.history.add(cmd); // optional       cmd.execute();           }}/* The Receiver class */public class Light {   public Light() {   }   public void turnOn() {      System.out.println("The light is on");   }   public void turnOff() {      System.out.println("The light is off");   }}/* The Command for turning on the light - ConcreteCommand #1 */public class FlipUpCommand implements Command {   private Light theLight;   public FlipUpCommand(Light light) {      this.theLight = light;   }   public void execute(){      theLight.turnOn();   }}/* The Command for turning off the light - ConcreteCommand #2 */public class FlipDownCommand implements Command {   private Light theLight;   public FlipDownCommand(Light light) {      this.theLight = light;   }   public void execute() {      theLight.turnOff();   }}/* The test class or client */public class PressSwitch {   public static void main(String[] args){      Light lamp = new Light();      Command switchUp = new FlipUpCommand(lamp);      Command switchDown = new FlipDownCommand(lamp);      Switch mySwitch = new Switch();      try {         if ("ON".equalsIgnoreCase(args[0])) {            mySwitch.storeAndExecute(switchUp);         }         else if ("OFF".equalsIgnoreCase(args[0])) {            mySwitch.storeAndExecute(switchDown);         }         else {            System.out.println("Argument \"ON\" or \"OFF\" is required.");         }      } catch (Exception e) {         System.out.println("Arguments required.");      }   }}

命令模式的优点

  • 降低系统的耦合度。
  • 新的命令可以很容易地加入到系统中。
  • 可以比较容易地设计一个命令队列和宏命令(组合命令)。
  • 可以方便地实现对请求的Undo和Redo。

命令模式的缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。







0 0