命令模式可以很轻松的实现撤销(Undo)功能。

命令的接受者:

 1unit uReceiveObject;
 2
 3interface
 4
 5type
 6  TLight = class(TObject)
 7  public
 8    procedure Open;
 9    procedure Off;
10  end;
11
12implementation
13
14{ TLight }
15
16procedure TLight.Off;
17begin
18  Writeln('Light is off.');
19end;
20
21procedure TLight.Open;
22begin
23  Writeln('Light is on.');
24end;
25
26end.
27

命令对象:

 1unit uCommandObject;
 2
 3interface
 4
 5uses
 6  uReceiveObject;
 7
 8type
 9  TCommand = class(TObject)
10  public
11    procedure Execute; virtual; abstract;
12    procedure Undo;    virtual; abstract;
13  end;
14
15  TLightOnCommand = class(TCommand)
16  private
17    FLight: TLight;
18  public
19    constructor Create(aLight: TLight);
20    procedure Execute; override;
21    procedure Undo;    override;
22  end;
23
24  TLightOffCommand = class(TCommand)
25  private
26    FLight: TLight;
27  public
28    constructor Create(aLight: TLight);
29    procedure Execute; override;
30    procedure Undo;    override;
31  end;
32
33implementation
34
35{ TLightOnCommand }
36
37constructor TLightOnCommand.Create(aLight: TLight);
38begin
39  FLight := aLight;
40end;
41
42procedure TLightOnCommand.Execute;
43begin
44  FLight.Open;
45end;
46
47procedure TLightOnCommand.Undo;
48begin
49  FLight.Off;
50end;
51
52{ TLightOffCommand }
53
54constructor TLightOffCommand.Create(aLight: TLight);
55begin
56  FLight := aLight;
57end;
58
59procedure TLightOffCommand.Execute;
60begin
61  FLight.Off;
62end;
63
64procedure TLightOffCommand.Undo;
65begin
66  FLight.Open;
67end;
68
69end.
70

命令的请求者:

 1unit uSimpleRemoteWithUndo;
 2
 3interface
 4
 5uses
 6  uCommandObject;
 7
 8type
 9  TSimpleRemoteWithUndo = class(TObject)
10  private
11    FOnCommand  : TCommand;
12    FOffCommand : TCommand;
13    FUndoCommand: TCommand;
14  public
15    procedure SetCommand(aOnCommand, aOffCommand: TCommand);
16    procedure OnButtonWasPressed;
17    procedure OffButtonWasPressed;
18    procedure UndoButtonWasPressed;
19  end;  
20
21implementation
22
23{ TSimpleRemoteWithUndo }
24
25procedure TSimpleRemoteWithUndo.OffButtonWasPressed;
26begin
27  FOffCommand.Execute;
28  FUndoCommand := FOffCommand;
29end;
30
31procedure TSimpleRemoteWithUndo.OnButtonWasPressed;
32begin
33  FOnCommand.Execute;
34  FUndoCommand := FOnCommand;
35end;
36
37procedure TSimpleRemoteWithUndo.SetCommand(aOnCommand, aOffCommand: TCommand);
38begin
39  FOnCommand  := aOnCommand;
40  FOffCommand := aOffCommand;
41end;
42
43procedure TSimpleRemoteWithUndo.UndoButtonWasPressed;
44begin
45  FUndoCommand.Undo;
46end;
47
48end.
49

客户端,创建具体的命令对象:

 1program pSimpleRemoteWithUndoTest;
 2
 3{$APPTYPE CONSOLE}
 4
 5uses
 6  uSimpleRemoteWithUndo in 'uSimpleRemoteWithUndo.pas',
 7  uCommandObject in 'uCommandObject.pas',
 8  uReceiveObject in 'uReceiveObject.pas';
 9
10var
11  Remote: TSimpleRemoteWithUndo;
12  Light : TLight;
13  LightOnCommand : TCommand;
14  LightOffCommand: TCommand;
15  
16begin
17  Remote := TSimpleRemoteWithUndo.Create;
18
19  Light  := TLight.Create;
20
21  LightOnCommand  := TLightOnCommand.Create(Light);
22  LightOffCommand := TLightOffCommand.Create(Light);
23
24  Remote.SetCommand(LightOnCommand, LightOffCommand);
25
26  Remote.OnButtonWasPressed;
27  Remote.OffButtonWasPressed;
28  Remote.UndoButtonWasPressed;
29  Writeln;
30  Remote.OffButtonWasPressed;
31  Remote.OnButtonWasPressed;
32  Remote.UndoButtonWasPressed;
33
34  Remote.Free;
35  Light.Free;
36  LightOnCommand.Free;
37  LightOffCommand.Free;
38  
39  Readln;
40end.
41

运行结果:

 
 

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]的更多相关文章

  1. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]

      1   2{<HeadFirst设计模式>之命令模式 }   3{ 本单元中的类为命令的接收者      }   4{ 编译工具 :Delphi7.0         }   5{ 联 ...

  2. .NET设计模式(17):命令模式(Command Pattern)(转)

    概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...

  3. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

  7. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  8. C#设计模式学习笔记:(14)命令模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...

  9. 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...

随机推荐

  1. 函数的作用域、作用域链以及return关键字

    1.作用域 全局作用域:在函数外部使用var关键字定义的变量 局部作用域:在函数内部使用var关键字定义的变量 特点   (1)局部变量无法直接影响全局变量    (2)在局部作用域中可以使用全局作用 ...

  2. xcart-子分类/语言不显示

    由于数据库的版本不同,表名会区分大小写的情况,这样就导致xcart语言相关的信息显示不出来,此时只需更改根目录下的init.php文件,如下: 改成小写的就OK了.

  3. js实现把多个数据分成3个一组

    主要代码: var stuCount = res.data; if (stuCount.length>0){ var objList = new Object(); var arr = new ...

  4. jvisualvm图解【转】

    jvisualvm图解[转]   http://blog.csdn.net/a19881029/article/details/8432368 jvisualvm能干什么:监控内存泄露,跟踪垃圾回收, ...

  5. 【转载】objective-c强引用与弱引用

    形象比喻蛮好玩的^_^    __weak 和 __strong 会出现在声明中   默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用.这意味着,只要引用存在,对象就不能被销毁 ...

  6. Joomla - 优化(时区、google字体、压缩图片、压缩自定义代码)

    Joomla - 优化(时区.google字体.压缩图片.压缩自定义代码) 一.时区 发布文章是往往会发现发布时间和当前时间对不上,原因是 Joomla 用的是国际标准时间,和中国时区大约相差8小时, ...

  7. day 41 前端之前端初识

    前端之前端初识   前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...

  8. oracle中utl_file包读写文件操作实例学习

    在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create ...

  9. ORA-01790: 表达式必须具有与对应表达式相同的数据类型

    出现这种错误,要先看一下是不是sql中有用到连接:union,unio all之类的,如果有,需要注意相同名称字段的数据类型一定要相同.

  10. 1.Spring【IOC】XML方式

    1.下载开发包 http://repo.springsource.org/libs-release-local/org/springframework/spring 2.创建WEB工程,引入jar包 ...