java设计模式进阶_command

原创 2016年08月31日 10:11:33

这里写图片描述

//
//
//  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)

一、概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 二、适用性 1.抽象出待执行的动作以参数化某对象。 2.在不同的时刻指...
  • l1028386804
  • l1028386804
  • 2015年05月08日 00:22
  • 3875

Java开发中的23种设计模式详解----命令模式(Command)

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其...
  • sjyttkl
  • sjyttkl
  • 2017年06月21日 12:23
  • 665

设计模式-----COMMAND模式

COMMAND模式是最简单,最优雅的设计模式之一。COMMAND模式的使用范围非常宽广。 COMMAND模式通过对命令的封装接触了系统的逻辑互联关系和实际连接的设备之间的耦合。简单的说就是COMMA...
  • u013812682
  • u013812682
  • 2016年11月28日 16:44
  • 275

设计模式 —— 命令模式(Command Pattern)

命令模式(Command Pattern)概念: 概述:在软件设计中,我们经常会遇到某些对象发送请求,然后某些对象接受请求后执行,但发送请求的对象可能并不知道接受请求的对象是谁,执行的是什么动作。...
  • wwh578867817
  • wwh578867817
  • 2016年05月29日 18:34
  • 920

设计模式之命令模式---Command Pattern

模式的定义命令模式是一个高内聚的模式,定义如下:Encapsulate a request as an object,thereby letting you parameterize clients ...
  • hfreeman2008
  • hfreeman2008
  • 2016年08月06日 10:37
  • 1499

MongoDB 进阶模式设计

12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就让我们来回顾一下吧: ——————————————————————————————————————————————————...
  • zrjdds
  • zrjdds
  • 2016年08月09日 11:48
  • 751

React技术栈进阶之路之设计模式篇

1.Redux导致的组件多余的渲染问题请仔细阅读React 组件间通讯的文章的最后一个例子,最后的输出结果为:这是因为在最后一个定时器中是如下的代码: setTimeout(() => { ...
  • liangklfang
  • liangklfang
  • 2017年07月01日 09:22
  • 796

Java设计模式之命令模式

继续23种设计模式系列,本文介绍命令模式。
  • jason0539
  • jason0539
  • 2015年04月19日 08:31
  • 21010

JAVA设计模式-Command

Command模式就像linux的shell命令一样,输入一条命令,它就能执行相应的操作。例如,我们想要打开电视机,我们不需要用tv.turnOn()这样的方法来打开,而是类似command.exe(...
  • huwei1991
  • huwei1991
  • 2013年05月18日 11:14
  • 388

[C++设计模式] command 命令模式

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者...
  • hustyangju
  • hustyangju
  • 2015年07月20日 10:35
  • 881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java设计模式进阶_command
举报原因:
原因补充:

(最多只允许输入30个字)