设计模式(13)----- 命令设计模式(升级----加一个撤销的命令)

Posted qingruihappy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(13)----- 命令设计模式(升级----加一个撤销的命令)相关的知识,希望对你有一定的参考价值。

RemoteControlWithUndo

public class RemoteControlWithUndo {

    Command[] onCommands;

    Command[] offCommands;

    Command undoCommand;

 

    public RemoteControlWithUndo() {

         onCommands = new Command[7];

         offCommands = new Command[7];

 

         Command noCommand = new NoCommand();

         for(int i=0;i<7;i++) {

              onCommands[i] = noCommand;

              offCommands[i] = noCommand;

         }

         undoCommand = noCommand;

    }

 

    public void setCommand(int slot, Command onCommand, Command offCommand)

{

         onCommands[slot] = onCommand;

         offCommands[slot] = offCommand;

    }

 

    public void onButtonWasPushed(int slot) {

         onCommands[slot].execute();

         undoCommand = onCommands[slot];

    }

 

    public void offButtonWasPushed(int slot) {

         offCommands[slot].execute();

         undoCommand = offCommands[slot];

    }

 

    public void undoButtonWasPushed() {

         undoCommand.undo();

    }

 

}

说白了就是在执行关闭和打开的按钮的时候记录一下上一次的命令对象。Command undoCommand;里面。

LightOffCommand

public class LightOffCommand implements Command {

    Light light;

 

    public LightOffCommand(Light light) {

         this.light = light;

    }

 

    public void execute() {

         light.off();

    }

 

    public void undo() {

         light.on();

    }

}

LightOnCommand

public class LightOnCommand implements Command {

    Light light;

 

    public LightOnCommand(Light light) {

         this.light = light;

    }

 

    public void execute() {

         light.on();

    }

 

    public void undo() {

         light.off();

    }

}

在命令对象的undo中总是与原来的想法的。这个是非此即彼的

假如是多条命令的就加一个常量就行了

package com.DesignPatterns.ae.command3;

/**

*

  • @author qingruihappy
  • @data 2018年9月28日 下午11:53:23
  • @说明:

*这里说白了就是在 *步骤1:定义的接口的规范中又多加了一个撤销的抽象的方法

*步骤2:在开关中一旦调用完命令指令的对象后,就会把这个命令指令的对象赋值给接口是定义的全局变量。来做记录。

*步骤3:一旦调用撤销的命令就会拿到做记录的命令指令对象发出相应的指令,从而实现上一次的命令。

*步骤4:这个时候也需要在命令指令的对象中记录上一次的调用的实例方法(也可以不用的)。 *为什么要是不用呢,因为假如我们上一次是风扇是中风,现在调成高风了,我们现在假如撤销,我们知道现在调用的是

*中风的命令对象,那也就是中风的方法了,所以没有必要记录的。所以说这个代码可以优化的。

*/

public class Test {

    public static void main(String[] args) {

         RemoteControlWithUndo remoteControl = new RemoteControlWithUndo();

         Light livingRoomLight = new Light("Living Room");

         LightOnCommand livingRoomLightOn = new

LightOnCommand(livingRoomLight);

         LightOffCommand livingRoomLightOff = new

LightOffCommand(livingRoomLight);

         remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);

         remoteControl.onButtonWasPushed(0);

         remoteControl.offButtonWasPushed(0);

         remoteControl.undoButtonWasPushed();

    }

}

kk

以上是关于设计模式(13)----- 命令设计模式(升级----加一个撤销的命令)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式(12)----- 命令设计模式(升级----一个开关控制多条命令)

SharePoint 升级 Web Site 模式

一天一个设计模式(13)——命令模式

内核升级和救援模式

13Vim编辑器使用详解

Linux就该这么学--第四章