命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持撤销的操作。


类图

173521625.png(图片源于网络)


代码实现(Java)

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


// LightOffCommand.java
public class LightOffCommand implements Command {
    Light light;
                                
    public LightOffCommand(Light light) {
        this.light = light;
    }
                                
    public void execute() {
        light.off();
    }
}


// LightOnCommand.java
public class LightOnCommand implements Command {
    Light light;
                             
    public LightOnCommand(Light light) {
        this.light = light;
    }
                            
    public void execute() {
        light.on();
    }
}


// GarageDoorOpenCommand.java
public class GarageDoorOpenCommand implements Command {
    GarageDoor garageDoor;
    public GarageDoorOpenCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }
    public void execute() {
        garageDoor.up();
    }
}


// Light.java
public class Light {
    public Light() {
    }
    public void on() {
        System.out.println("Light is on");
    }
    public void off() {
        System.out.println("Light is off");
    }
}


// GarageDoor.java
public class GarageDoor {
    public GarageDoor() {
    }
    public void up() {
        System.out.println("Garage Door is Open");
    }
    public void down() {
        System.out.println("Garage Door is Closed");
    }
    public void stop() {
        System.out.println("Garage Door is Stopped");
    }
    public void lightOn() {
        System.out.println("Garage light is on");
    }
    public void lightOff() {
        System.out.println("Garage light is off");
    }
}


// This is the invoker
// SimpleRemoteControl.java
public class SimpleRemoteControl {
    Command slot;
           
    public SimpleRemoteControl() {}
           
    public void setCommand(Command command) {
        slot = command;
    }
           
    public void buttonWasPressed() {
        slot.execute();
    }
}


测试代码

// RemoteControlTest.java
public class RemoteControlTest {
    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        GarageDoor garageDoor = new GarageDoor();
        LightOnCommand lightOn = new LightOnCommand(light);
        GarageDoorOpenCommand garageOpen =
            new GarageDoorOpenCommand(garageDoor);
       
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
        remote.setCommand(garageOpen);
        remote.buttonWasPressed();
    }
}


运行效果

174307495.png