码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-04 08:44:55      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:des   str   常量   rgs   style   开关   happy   div   就会   

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)----- 命令设计模式(升级----加一个撤销的命令)

标签:des   str   常量   rgs   style   开关   happy   div   就会   

原文地址:https://www.cnblogs.com/qingruihappy/p/9739667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!