1. 程式人生 > 實用技巧 >Command Pattern

Command Pattern

Start



An Example


// Command.java
public interface Command {
    void execute();
    void undo();
}
//LightReceiver
public class LightReceiver {
    public void on(){
        System.out.println("The light is on.");
    }

    public void off(){
        System.out.println("The light is off.");
    }
}
// LightOnCommand.java
public class LightOnCommand implements Command{
    LightReceiver light;

    public LightOnCommand(LightReceiver light){
        this.light = light;
    }

    public void execute() {
        light.on();
    }

    public void undo() {
        light.off();
    }
}
// LightOffCommand.java
public class LightOffCommand implements Command{
    LightReceiver light;

    public LightOffCommand(LightReceiver light){
        this.light = light;
    }

    public void execute() {
        light.off();
    }

    public void undo() {
        light.on();
    }
}
// NoCommand.java
///初始化,用於初始化每個按鈕
public  class NoCommand implements Command {
    public void execute() {

    }

    public void undo() {

    }
}
// RemoteController.java
public class RemoteController {

    Command[] onCommands ;
    Command[] offCommands;

    Command undoCommand;

    public RemoteController(){
        onCommands = new Command[5];
        offCommands = new Command[5];

        for (int i = 0; i <5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    public void setCommand(int no, Command onCommand, Command offCommand){
        onCommands[no] = onCommand;
        offCommands[no] = offCommand;
    }

    public void onButtonWasPushed(int no){
        onCommands[no].execute();
        undoCommand = onCommands[no];
    }

    public void offButtonWasPushed(int no){
        offCommands[no].execute();
        undoCommand = offCommands[no];
    }

    public void undoButtonWasPushed(){
        undoCommand.undo();
    }
}
// Client.java
public class Client {
    public static void main(String[] args) {
        LightReceiver light = new LightReceiver();

        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);

        RemoteController remoteController = new RemoteController();
        remoteController.setCommand(0, lightOnCommand, lightOffCommand);

        System.out.println("Light on pushed");
        remoteController.onButtonWasPushed(0); //The light is on.
    }
}