From 120555f74087a546bc70cd24eb628f53292ea3ed Mon Sep 17 00:00:00 2001 From: "jack.zhang" Date: Wed, 15 Apr 2015 11:47:25 +0800 Subject: [PATCH] add redo function on command pattern --- command/src/main/java/com/iluwatar/App.java | 10 +++++++++ .../src/main/java/com/iluwatar/Command.java | 2 ++ .../java/com/iluwatar/InvisibilitySpell.java | 7 +++++++ .../main/java/com/iluwatar/ShrinkSpell.java | 7 +++++++ .../src/main/java/com/iluwatar/Target.java | 3 ++- .../src/main/java/com/iluwatar/Wizard.java | 21 ++++++++++++++++--- 6 files changed, 46 insertions(+), 4 deletions(-) diff --git a/command/src/main/java/com/iluwatar/App.java b/command/src/main/java/com/iluwatar/App.java index 382ce32ce..9e1b43b1a 100644 --- a/command/src/main/java/com/iluwatar/App.java +++ b/command/src/main/java/com/iluwatar/App.java @@ -20,7 +20,17 @@ public class App { wizard.castSpell(new InvisibilitySpell(), goblin); goblin.printStatus(); + wizard.undoLastSpell(); goblin.printStatus(); + + wizard.undoLastSpell(); + goblin.printStatus(); + + wizard.redoLastSpell(); + goblin.printStatus(); + + wizard.redoLastSpell(); + goblin.printStatus(); } } diff --git a/command/src/main/java/com/iluwatar/Command.java b/command/src/main/java/com/iluwatar/Command.java index da56e2268..9a8446149 100644 --- a/command/src/main/java/com/iluwatar/Command.java +++ b/command/src/main/java/com/iluwatar/Command.java @@ -11,6 +11,8 @@ public abstract class Command { public abstract void undo(); + public abstract void redo(); + @Override public abstract String toString(); diff --git a/command/src/main/java/com/iluwatar/InvisibilitySpell.java b/command/src/main/java/com/iluwatar/InvisibilitySpell.java index 9a35a9df3..175aef4fc 100644 --- a/command/src/main/java/com/iluwatar/InvisibilitySpell.java +++ b/command/src/main/java/com/iluwatar/InvisibilitySpell.java @@ -17,6 +17,13 @@ public class InvisibilitySpell extends Command { } } + @Override + public void redo() { + if (target != null) { + target.setVisibility(Visibility.INVISIBLE); + } + } + @Override public String toString() { return "Invisibility spell"; diff --git a/command/src/main/java/com/iluwatar/ShrinkSpell.java b/command/src/main/java/com/iluwatar/ShrinkSpell.java index 44a5b7144..bb7d93831 100644 --- a/command/src/main/java/com/iluwatar/ShrinkSpell.java +++ b/command/src/main/java/com/iluwatar/ShrinkSpell.java @@ -15,10 +15,17 @@ public class ShrinkSpell extends Command { @Override public void undo() { if (oldSize != null && target != null) { + Size temp = target.getSize(); target.setSize(oldSize); + oldSize = temp; } } + @Override + public void redo() { + undo(); + } + @Override public String toString() { return "Shrink spell"; diff --git a/command/src/main/java/com/iluwatar/Target.java b/command/src/main/java/com/iluwatar/Target.java index 46011a9a9..a35374911 100644 --- a/command/src/main/java/com/iluwatar/Target.java +++ b/command/src/main/java/com/iluwatar/Target.java @@ -31,7 +31,8 @@ public abstract class Target { public abstract String toString(); public void printStatus() { - System.out.println(String.format("%s, size=%s visibility=%s", this, + System.out.println(String.format("%s, [size=%s] [visibility=%s]", this, getSize(), getVisibility())); + System.out.println(); } } diff --git a/command/src/main/java/com/iluwatar/Wizard.java b/command/src/main/java/com/iluwatar/Wizard.java index e3d19be1f..69995b9aa 100644 --- a/command/src/main/java/com/iluwatar/Wizard.java +++ b/command/src/main/java/com/iluwatar/Wizard.java @@ -1,8 +1,12 @@ package com.iluwatar; +import java.util.Deque; +import java.util.LinkedList; + public class Wizard extends Target { - private Command previousSpell; + private Deque undoStack = new LinkedList<>(); + private Deque redoStack = new LinkedList<>(); public Wizard() { setSize(Size.NORMAL); @@ -12,16 +16,27 @@ public class Wizard extends Target { public void castSpell(Command command, Target target) { System.out.println(this + " casts " + command + " at " + target); command.execute(target); - previousSpell = command; + undoStack.offerLast(command); } public void undoLastSpell() { - if (previousSpell != null) { + if (!undoStack.isEmpty()) { + Command previousSpell = undoStack.pollLast(); + redoStack.offerLast(previousSpell); System.out.println(this + " undoes " + previousSpell); previousSpell.undo(); } } + public void redoLastSpell() { + if (!redoStack.isEmpty()) { + Command previousSpell = redoStack.pollLast(); + undoStack.offerLast(previousSpell); + System.out.println(this + " redoes " + previousSpell); + previousSpell.redo(); + } + } + @Override public String toString() { return "Wizard";