//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : Command.java
// @ Date : 2016/8/31
// @ Author :
//
//
public abstract class Command {
public abstract void execute(Target target);
public abstract void undo();
public abstract void redo();
public abstract String toString();
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : InvisibilitySpell.java
// @ Date : 2016/8/31
// @ Author :
//
//
public class InvisibilitySpell extends Command {
private Target target;
public void execute(Target target) {
target.setVisibility(Visibility.INVISIBLE);
this.target = target;
}
public void undo() {
if(target != null){
target.setVisibility(Visibility.VISIBLE);
}
}
@Override
public void redo() {
if(target != null){
target.setVisibility(Visibility.INVISIBLE);
}
}
public String toString() {
return "Invisibility spell";
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : ShrinkSpell.java
// @ Date : 2016/8/31
// @ Author :
//
//
public class ShrinkSpell extends Command {
private Size oldSize;
private Target target;
public void execute(Target target) {
oldSize = target.getSize();
target.setSize(Size.SMALL);
this.target = target;
}
public void undo() {
if(oldSize != null && target != null)
{
Size temp = target.getSize();
target.setSize(oldSize);
oldSize = temp;
}
}
public String toString() {
return "Shrink spell";
}
@Override
public void redo() {
undo();
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : Target.java
// @ Date : 2016/8/31
// @ Author :
//
//
public abstract class Target {
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("%s, [size=%s] [visibility=%s]", this,
getSize(), getVisibility()));
System.out.println();
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : Goblin.java
// @ Date : 2016/8/31
// @ Author :
//
//
public class Goblin extends Target {
public Goblin(){
setSize(Size.NORMAL);
setVisibility(Visibility.VISIBLE);
}
public String toString() {
return "Goblin";
}
}
import java.util.Deque;
import java.util.LinkedList;
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : Wizard.java
// @ Date : 2016/8/31
// @ Author :
//
//
public class Wizard extends Target {
private Deque<Command> undoStack = new LinkedList<>();
private Deque<Command> redoStack = new LinkedList<>();
public Wizard() {
setSize(Size.NORMAL);
setVisibility(Visibility.VISIBLE);
}
public void castSpell(Command command, Target target) {
System.out.println(this + " casts " + command + " at " + target);
command.execute(target);
undoStack.offerLast(command);
}
public void undoLastSpell() {
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();
}
}
public String toString() {
return "Wizard";
}
}
public enum Size {
SMALL("small"),
NORMAL("normal"),
LARGE("large"),
UNDEFINED("");
private String title;
Size(String title){
this.title = title;
}
@Override
public String toString() {
return title;
}
}
public enum Visibility {
VISIBLE("visible"),
INVISIBLE("invisible"),
UNDEFINED("");
private String title;
Visibility(String title){
this.title = title;
}
@Override
public String toString() {
return title;
}
}
public class App {
public static void main(String[] args) {
Wizard wizard = new Wizard();
Goblin goblin = new Goblin();
goblin.printStatus();
wizard.castSpell(new ShrinkSpell(), goblin);
goblin.printStatus();
wizard.castSpell(new InvisibilitySpell(), goblin);
goblin.printStatus();
wizard.undoLastSpell();
goblin.printStatus();
wizard.undoLastSpell();
goblin.printStatus();
wizard.redoLastSpell();
goblin.printStatus();
wizard.redoLastSpell();
goblin.printStatus();
}
}
/*
Goblin, [size=normal] [visibility=visible]
Wizard casts Shrink spell at Goblin
Goblin, [size=small] [visibility=visible]
Wizard casts Invisibility spell at Goblin
Goblin, [size=small] [visibility=invisible]
Wizard undoes Invisibility spell
Goblin, [size=small] [visibility=visible]
Wizard undoes Shrink spell
Goblin, [size=normal] [visibility=visible]
Wizard redoes Shrink spell
Goblin, [size=small] [visibility=visible]
Wizard redoes Invisibility spell
Goblin, [size=small] [visibility=invisible]
*/
java设计模式进阶_command
最新推荐文章于 2022-10-08 12:55:19 发布