本文共 4715 字,大约阅读时间需要 15 分钟。
命令模式通过将操作包装成对象来实现操作的撤销、恢复上一个状态、重复执行命令等功能。例如,在编程中,这种模式常用于支持撤销(undo)和重做(redo)的功能,比如代码编辑器中的命令历史记录。
public abstract class Command { public abstract void execute(Receiver receiver); public abstract void undo(); public abstract void redo(); @Override public abstract String toString();}
public class InvisibilityCommand extends Command { private Receiver receiver; @Override public void execute(Receiver receiver) { receiver.setVisibility(Visibility.INVISIBLE); this.receiver = receiver; } @Override public void undo() { if (receiver != null) { receiver.setVisibility(Visibility.VISIBLE); } } @Override public void redo() { if (receiver != null) { receiver.setVisibility(Visibility.INVISIBLE); } } @Override public String toString() { return "invisible"; }}
public class ShrinkCommand extends Command { private Size oldSize; private Receiver receiver; @Override public void execute(Receiver receiver) { oldSize = receiver.getSize(); receiver.getSize(Size.SMALL); this.receiver = receiver; } @Override public void undo() { if (oldSize != null && receiver != null) { Size temp = receiver.getSize(); receiver.setSize(oldSize); } } @Override public void redo() { undo(); } @Override public String toString() { return "small"; }}
public abstract class Receiver { private Size size; private Visibility visibility; public Size getSize() { return size; } public void setSize(Size size) { this.size = size; } public Visibility getVisibility() { return visibility; } public void setVisibility(Visibility visibility) { this.visibility = visibility; } public abstract String toString(); public void printStatus() { System.out.println(String.format("[size=%s] [visibility=%s]", getSize(), getVisibility())); }}
public class GoblinReceiver extends Receiver { public GoblinReceiver() { setSize(Size.NORMAL); setVisibility(Visibility.VISIBLE); } public String toString() { return "GoblinReceiver"; }}
public class Invoker { private DequeundoStack = new LinkedList<>(); private Deque redoStack = new LinkedList<>(); public void call(Command command, Receiver receiver) { command.execute(receiver); undoStack.offerLast(command); } public void undo() { Command previousSpell = undoStack.pollLast(); if (previousSpell != null) { redoStack.offerLast(previousSpell); System.out.println(" undoes " + previousSpell + " command"); previousSpell.undo(); } } public void redo() { Command previousSpell = redoStack.pollLast(); if (previousSpell != null) { undoStack.offerLast(previousSpell); System.out.println(" redoes " + previousSpell + " command"); previousSpell.redo(); } } @Override public String toString() { return "Invoker"; }}
public class App { public static void main(String[] args) { Invoker invoker = new Invoker(); GoblinReceiver goblinReceiver = new GoblinReceiver(); goblinReceiver.printStatus(); invoker.call(new ShrinkCommand(), goblinReceiver); goblinReceiver.printStatus(); invoker.call(new InvisibilityCommand(), goblinReceiver); goblinReceiver.printStatus(); invoker.undo(); goblinReceiver.printStatus(); invoker.undo(); goblinReceiver.printStatus(); invoker.redo(); goblinReceiver.printStatus(); invoker.redo(); goblinReceiver.printStatus(); }}
接收者状态:[size=normal] [visibility=visible]Invoker在GoblinReceiver上执行命令 small接收者状态:[size=small] [visibility=visible]Invoker在GoblinReceiver上执行命令 invisible接收者状态:[size=small] [visibility=invisible]Invoker undoes invisible command接收者状态:[size=small] [visibility=visible]Invoker undoes small command接收者状态:[size=normal] [visibility=visible]Invoker redoes small command接收者状态:[size=small] [visibility=visible]Invoker redoes invisible command接收者状态:[size=small] [visibility=invisible]
转载地址:http://wpisz.baihongyu.com/