北辰

c/c++/java程序

java设计模式进阶_command

这里写图片描述

//
//
//  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]
*/



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwww_com/article/details/52382229
文章标签: java设计模式
个人分类: java设计模式进阶
想对作者说点什么? 我来说一句

Java23种设计模式讲解

2018年03月09日 2.04MB 下载

没有更多推荐了,返回首页

不良信息举报

java设计模式进阶_command

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭