java_command_宏命令

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值