一. 定义
命令模式将请求封装成对象,这可以让你使用不同的请求、队列或者日志请求来参数化其它对象。命令模式也可以支持撤销操作。
二. 模式起源
三. 设计原则
四. UML图
五. 代码
5.1 Receiver类: 灯
package model.command;
public class Light {
public void on() {
System.out.println("light on...");
}
public void off() {
System.out.println("light off...");
}
}
5.2 Receiver类: 门
package model.command;
public class Door {
public void open() {
System.out.println("door open...");
}
public void close() {
System.out.println("door close...");
}
}
5.3 Receiver类: 收音机
package model.command;
public class Video {
public void up() {
System.out.println("video up...");
}
public void down() {
System.out.println("video down...");
}
}
5.4 命令接口
package model.command;
/**
* 命令接口
*/
public interface Command {
/**
* 执行命令方法
*/
public abstract void execute();
/**
* 撤销命令方法
*/
public abstract void undo();
}
5.5 开灯命令类
package model.command;
/**
* 关灯命令
*/
public class LightOffCommand implements Command {
// 关灯命令类中维护了一个灯对象
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
this.light.off();
}
@Override
public void undo() {
this.light.on();
}
}
5.6 关灯命令类
package model.command;
/**
* 关灯命令
*/
public class LightOffCommand implements Command {
// 关灯命令类中维护了一个灯对象
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
this.light.off();
}
@Override
public void undo() {
this.light.on();
}
}
5.7 增音命令类
package model.command;
/**
* 增音命令类
*/
public class VideoUpCommand implements Command {
// 维护了一个收音机类
private Video video;
public VideoUpCommand(Video video) {
this.video = video;
}
@Override
public void execute() {
this.video.up();
}
@Override
public void undo() {
this.video.down();
}
}
5.8 降音命令类
package model.command;
/**
* 降音命令类
*/
public class VideoDownCommand implements Command {
// 内部维护了一个收音机类
private Video video;
public VideoDownCommand(Video video) {
this.video = video;
}
@Override
public void execute() {
this.video.down();
}
@Override
public void undo() {
this.video.up();
}
}
5.9 开门命令类
package model.command;
/**
* 开门命令类
*/
public class DoorOpenCommand implements Command {
// 开门命令类中维护了一个门对象
private Door door;
public DoorOpenCommand(Door door) {
this.door = door;
}
@Override
public void execute() {
this.door.open();
}
@Override
public void undo() {
this.door.close();
}
}
5.10 关门命令类
package model.command;
/**
* 关门命令类
*/
public class DoorCloseCommand implements Command {
// 关门命令类中维护了一个门对象
private Door door;
public DoorCloseCommand(Door door) {
this.door = door;
}
@Override
public void execute() {
this.door.close();
}
@Override
public void undo() {
this.door.open();
}
}
5.11 Invoker类: 遥控器类
package model.command;
/**
* 遥控器类
*/
public class RemoteController {
// 当前命令
private Command command;
/**
* 前一个命令 用来撤销命令时返回
* 注: 使用对应来引用前一个命令, 只支持撤销前一次的 不支持撤销多次 撤销多次需要使用栈来存储命令
*/
private Command preCommand;
public RemoteController() {
}
/**
* 设置命令
*
* @param command
*/
public void setCommand(Command command) {
this.command = command;
}
/**
* 触发命令的入口方法
*/
public void onButtonPressed() {
this.command.execute();
this.preCommand = command;
}
/**
* 撤销命令的入口方法 调用前一个命令的undo方法即可
*/
public void undoButtonPressed() {
preCommand.undo();
}
}
5.12 client类: 测试类
package model.command;
/**
* 测试类
*/
public class Main {
public static void main(String[] args) {
RemoteController remoteController = new RemoteController();
Light light = new Light();
LightOnCommand lightOnCommand = new LightOnCommand(light);
LightOffCommand lightOffCommand = new LightOffCommand(light);
Door door = new Door();
DoorOpenCommand doorOpenCommand = new DoorOpenCommand(door);
DoorCloseCommand doorCloseCommand = new DoorCloseCommand(door);
remoteController.setCommand(lightOnCommand);
remoteController.onButtonPressed();
remoteController.setCommand(lightOffCommand);
remoteController.onButtonPressed();
remoteController.undoButtonPressed();
remoteController.setCommand(doorOpenCommand);
remoteController.onButtonPressed();
remoteController.undoButtonPressed();
}
}
5.13 结果
light on...
light off...
light on...
door open...
door close...