java_command_宏命令

来源:互联网 发布:数据合并 编辑:程序博客网 时间:2024/06/08 12:11

introduction:

这样做的目的可以减少“硬编码”,动态决定命令组合,在使用上更灵活,一般来说,宏命令的做法更优雅,也需要较少的新代码。

demo:

description:模拟开舞会的场景,此时会需要灯光和音乐

Light.java

public class Light {    private String name;        public Light(String name){        this.name = name;    }        public void on(){        System.out.println(name+" on");    }        public void off(){        System.out.println(name+" off");    }    }

Player.java

public class Player {    private String name;        public Player(String name){        this.name = name;    }        public void off(){        System.out.println(name+" off");    }        public void on(){        System.out.println(name+" on");    }        public void volumn(int num){        System.out.println(name+" : "+num);    }        public void cd(){        System.out.println(name+" cd");    }        public void dvd(){        System.out.println(name+" dvd");    }}


Command.java
public interface Command {      void execute();      void undo();  } 

LightOffCommand.java

public interface Command {      void execute();      void undo();  } 

LightOnCommand.java

public class LightOnCommand implements Command{    private Light light;    public LightOnCommand(Light light){        this.light = light;    }    @Override    public void execute() {        light.on();    }    @Override    public void undo() {        light.off();    }}

NoCommand.java

public class NoCommand implements Command{          @Override      public void execute() {          // TODO Auto-generated method stub                }        @Override      public void undo() {          // TODO Auto-generated method stub                }    }

PlayeroffCommand.java

public class PlayerOffCommand implements Command{    private Player player;        public PlayerOffCommand(Player player){        this.player = player;    }    @Override    public void execute() {        player.off();    }    @Override    public void undo() {        player.on();        player.cd();        player.volumn(11);    }        }

PlayerOnCommand.java

public class PlayerOnCommand implements Command{    private Player player;        public PlayerOnCommand(Player player){        this.player = player;    }    @Override    public void execute() {        player.on();        player.cd();        player.volumn(11);    }    @Override    public void undo() {        player.off();    }        }

MacroOffCommand.java

public class MacroOffCommand implements Command{    private Command[] commands;        public MacroOffCommand(Command[] commands){        this.commands = commands;    }    @Override    public void execute() {        for(int i=0;i<commands.length;i++){            commands[i].execute();        }    }    @Override    public void undo() {        for(int i=0;i<commands.length;i++){            commands[i].undo();        }    }}

MacroOnCommand.java

public class MacroOnCommand implements Command{    private Command[] commands;        public MacroOnCommand(Command[] commands){        this.commands = commands;    }    @Override    public void execute() {        for(int i=0;i<commands.length;i++){            commands[i].execute();        }    }    @Override    public void undo() {        for(int i=0;i<commands.length;i++){            commands[i].undo();        }    }}

RemoteControl.java

public class RemoteControl {        private Command[] onCommands;    private Command[] offCommands;    private Command undoCommand;        public RemoteControl(){        Command noCommand = new NoCommand();                onCommands = new Command[1];        offCommands = new Command[1];                this.undoCommand = noCommand;        for(int i=0;i<onCommands.length;i++){            this.onCommands[i] = noCommand;            this.offCommands[i] = noCommand;        }            }        public void setCommand(int index, Command onCommand, Command offCommand){        onCommands[index] = onCommand;        offCommands[index] = offCommand;    }        public void onButtonPressed(int index){        onCommands[index].execute();        undoCommand = offCommands[index];    }        public void offButtonPressed(int index){        offCommands[index].execute();        undoCommand = onCommands[index];    }        public void undoButtonPressed(){        undoCommand.execute();    }        public String toString(){        StringBuffer stringBuffer = new StringBuffer();        stringBuffer.append("--- command begin --- \n");        for(int i=0;i<onCommands.length;i++){            stringBuffer.append("["+i+"]"+onCommands[i].getClass().getSimpleName()+" , "+                    offCommands[i].getClass().getSimpleName()+"\n");        }        return stringBuffer.toString();    }}

ControllerLoader.java

public class ControllerLoader {    public static void main(String[] args) {        Light light = new Light("party light");        Player player = new Player("party player");                Command partyLightOn = new LightOnCommand(light);        Command partyLightOff = new LightOffCommand(light);        Command partyPlayerOn = new PlayerOnCommand(player);        Command partyPlayerOff = new PlayerOffCommand(player);                Command[] onCommands = {partyLightOn,partyPlayerOn};        Command[] offCommands = {partyLightOff,partyPlayerOff};                Command macroOn = new MacroOnCommand(onCommands);        Command macroOff = new MacroOffCommand(offCommands);                RemoteControl remoteControl = new RemoteControl();                remoteControl.setCommand(0, macroOn, macroOff);                System.out.println(remoteControl);                remoteControl.onButtonPressed(0);        remoteControl.offButtonPressed(0);        remoteControl.undoButtonPressed();    }}

运行结果:

--- command begin --- 
[0]MacroOnCommand , MacroOffCommand


party light on
party player on
party player cd
party player : 11
party light off
party player off
party light on
party player on
party player cd
party player : 11