命令模式可以应用到很多场景,比如实现do/undo功能、实现导航功能。本文使用命令模式实现了一个基本的do/undo功能。
角色介绍如下:
Command:抽象命令接口
CutCommand:具体命令之一——剪切命令
CommandManager:命令管理器,存储执行过的命令
Client:客户端
代码如下:
package com.pattern.command;
public interface Command {
/**
* execute this command
*/
public void execute();
/**
* revoke this command
*/
public void undo();
}
package com.pattern.command;
public class CutCommand implements Command {
private String name;
public CutCommand(final String name) {
this.name = name;
}
@Override
public void execute() {
System.out.println("Command " + name + " is executed");
}
@Override
public void undo() {
System.out.println("Command " + name + " is revoked");
}
}
package com.pattern.command;
import java.util.Stack;
public class CommandManager {
private Stack<Command> undoCommands = new Stack<>();
private Stack<Command> redoCommands = new Stack<>();
public void executeCommand(Command command) {
command.execute();
undoCommands.push(command);
//clear the redo list when new command is executed
if (!redoCommands.isEmpty()) {
redoCommands.clear();
}
}
public void undo() {
if (!undoCommands.isEmpty()) {
Command command = undoCommands.pop();
command.undo();
redoCommands.push(command);
}
}
public void redo() {
if (!redoCommands.isEmpty()) {
Command command = redoCommands.pop();
command.execute();
}
}
}
package com.pattern.command;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
CommandManager manager = new CommandManager();
manager.executeCommand(new CutCommand("Cut"));
manager.undo();
manager.redo();
}
}