Command模式实现的redo/undo功能(以前在闪吧发过)

原创 2004年09月21日 13:13:00
记得对设计模式描述得最好的就是csdn上面的一篇《追mm和设计模式》的帖子
下面是其中对Command模式的描述:


Command—俺有一个mm家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间
传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来
一个command,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个
男朋友送command,就数你最小气,才请我吃面。”,

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任
和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独
立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收
,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

这是Command模式的UML图 

 

 

class Command
{
        private function Command()
        {
        }
        // Methods
        public function Execute():Void
        {
        }
        public function UnExecute():Void
        {
        }
}

// "ConcreteCommand"
class CalculatorCommand extends Command
{
        // Fields
        private var $operator:String;
        private var operand:Number;
        private var calculator:Calculator;
        // Constructor
        public function CalculatorCommand(calculator:Calculator, $operator:String, operand:Number)
        {
                this.calculator = calculator;
                this.$operator = $operator;
                this.operand = operand;
        }
        // Properties
        public function set Operator(value:String):Void
        {
                $operator = value;
        }
        public function set Operand(value:Number):Void
        {
                operand = value;
        }
        // Methods
        public function Execute():Void
        {
                calculator.Operation($operator, operand);
        }
        public function UnExecute():Void
        {
                calculator.Operation(Undo($operator), operand);
        }
        // Private helper function
        private function Undo($operator:String):String
        {
                var undo:String ="";
                switch ($operator)
                {
                        case "+" :
                        undo = "-";
                        break;
                        case "-" :
                        undo = "+";
                        break;
                        case "*" :
                        undo = "/";
                        break;
                        case "/" :
                        undo = "*";
                        break;
                }
                return undo;
        }
}

// "Receiver"
class Calculator
{
        // Fields
        private var total:Number = 0;
        // Methods
        public function Operation($operator:String, operand:Number):Void
        {
                switch ($operator)
                {
                        case "+" :
                        total += operand;
                        break;
                        case "-" :
                        total -= operand;
                        break;
                        case "*" :
                        total *= operand;
                        break;
                        case "/" :
                        total /= operand;
                        break;
                }
                trace("Total =" + total + " (following" + $operator + " " + operand + ")");
        }
}

// "Invoker"
class User
{
        // Fields
        private var calculator:Calculator;
        private var commands:Array = new Array();
        private var current:Number = 0;
        public function User()
        {
                calculator = new Calculator();
        }
        // Methods
        public function Redo(levels:Number):Void
        {
                //trace(commands[current++] instanceof Command);
                trace("---- Redo " + levels + " levels ");
                // Perform redo operations
                for (var i = 0; i < levels; i++)
                {
                        if (current < commands.length - 1)
                        {
                                commands[current++].Execute();
                        }
                }
        }
        public function Undo(levels:Number):Void
        {
                trace("---- Undo" + levels + " levels ");
                // Perform undo operations
                for (var i = 0; i < levels; i++)
                {
                        if (current > 0)
                        {
                                commands[--current].UnExecute();
                        }
                }
        }
        public function Compute($operator:String, operand:Number):Void
        {
                // Create command operation and execute it
                var command:Command = new CalculatorCommand(calculator, $operator, operand);
                command.Execute();
                // Add command to undo list
                commands.push(command);
                current++;
        }
}

client.fla
// Create user and let her compute
var user:User = new User();
user.Compute('+', 100);
user.Compute('-', 50);
user.Compute('*', 10);
user.Compute('/', 2);
// Undo and then redo some commands
user.Undo(4);
user.Redo(3);

output:
Total =100 (following+ 100)
Total =50 (following- 50)
Total =500 (following* 10)
Total =250 (following/ 2)
---- Undo4 levels
Total =500 (following* 2)
Total =50 (following/ 10)
Total =100 (following+ 50)
Total =0 (following- 100)
---- Redo 3 levels
Total =100 (following+ 100)
Total =50 (following- 50)
Total =500 (following* 10)

Command模式实现撤销重做(Undo/Redo)

这是在实际项目中遇到的需求,项目中使用了Java Swing画界面,开始时没有实现撤销重做,后期要求加入撤销重做功能。在网上查找到资料说这种撤销重做的操作一般通过Command模式来实现,在实现过程中...
  • w1014074794
  • w1014074794
  • 2016年03月24日 22:30
  • 1601

Redo Undo 的三种实现

原文地址 Redo Undo 的三种实现 Published on 2012 年 6 月 26 日, by chenxin in 未分类. 在开发程序时,经常需要...
  • xue_jiang_han2013
  • xue_jiang_han2013
  • 2014年05月22日 15:44
  • 1442

实现编辑器的Undo Redo功能用Java来

    ...
  • dongliheng
  • dongliheng
  • 2007年08月09日 09:31
  • 2125

设计模式——命令模式实现undo、redo

设计模式——命令模式实现undo、redo 本文主要参考文章《命令模式场景之undo》 实现一个简单的undo、redo功能。比如数据库插入后想进行撤销操作。同时进行多个操作后进行撤销操作。 p...
  • wild46cat
  • wild46cat
  • 2016年07月05日 10:49
  • 1208

手把手教你写Undo、Redo程序

 手把手教你写Undo、Redo程序     Undo、Redo操作是很多具体编辑功能的软件所不能缺少的。最典型两种类型就是文本编辑和图像编辑软件。然而它的实现在某种程度上来说也不是很简单。我也废话少...
  • laiyiling
  • laiyiling
  • 2006年10月20日 13:39
  • 10585

撤销(undo)和重做(redo)的C++完美实现

今天做软件架构的作业,在易用性(usability)的一章里老师留了一道作业题: “Specify the data model for a four-function calculator tha...
  • csdn_ning
  • csdn_ning
  • 2017年05月23日 23:38
  • 596

Eclipse Redo undo implementation

最近做Eclipse插件,要为一个Multi的Editor做redo/undo功能,开始查到了很多资料,网上倒是有一篇讲TreeViewer的redo/undo功能的文章(参考: http://www...
  • maxgong2005
  • maxgong2005
  • 2007年12月22日 22:04
  • 1704

oracle笔记整理2——redo与undo

1. redo和undo 1) redo a) 也就是重新做的意思,当系统发生故障时重新做。 b) oracle日志文件分为重做日志文件(Redo Log File)和归档日志文件。 c) ...
  • thinkpadshi
  • thinkpadshi
  • 2015年12月29日 16:19
  • 1081

手把手教你写Undo、Redo程序(续)

手把手教你写Undo、Redo程序(续)    在第一篇文章“手把手教你写Undo、Redo程序”里,我介绍了如何实现一个基于图像操作的Undo, Redo框架结构。但是我们现在所讲的还只是Undo类...
  • laiyiling
  • laiyiling
  • 2006年10月22日 20:06
  • 5710

利用swing的undo包实现Undo/Redo功能

利用swing的undo包实现Undo/Redo功能 一、概述javax.swing.undo包提供了一系列接口和类,利用它可以方便的在程序中加入Undo/Redo功能。 先说说undo包引入的一个概...
  • EricXYY
  • EricXYY
  • 2007年04月10日 16:10
  • 4916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Command模式实现的redo/undo功能(以前在闪吧发过)
举报原因:
原因补充:

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