Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]
命令模式可以很轻松的实现撤销(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[转]的更多相关文章
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]
1 2{<HeadFirst设计模式>之命令模式 } 3{ 本单元中的类为命令的接收者 } 4{ 编译工具 :Delphi7.0 } 5{ 联 ...
- .NET设计模式(17):命令模式(Command Pattern)(转)
概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]
容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历: 1 2{<HeadFirst设计模式& ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类 } 4{ 编译工具: Delphi7.0 } 5{ E- ...
- C#设计模式学习笔记:(14)命令模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...
- 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)
1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...
随机推荐
- Android开发 TextView的开发记录
前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...
- 一个简单的SpringBoot入门程序
1. 使用IDEA构建Maven项目 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- nodejs vue-cli 微信公众号开发(一) 申请域名搭建服务器
一.搭建本地服务器 1.首先保存本地的80端口被node监听,利用内网穿透工具把80端口映射出去.(ngrok工具可以穿透内网使本地ip作为外网使用) 2.打开https://natapp.cn/tu ...
- [JZOJ4684] 【GDOI2017模拟8.11】卡牌游戏
题目 描述 题目大意 有111到2n2n2n牌,一开始分别给两个人,每人nnn张. 轮流出牌,给出对手出牌的顺序,若自己的牌更大,就记一分. 在中间的某个时刻可以改变游戏规则. 问最大的分数. 思考历 ...
- 廖雪峰Java13网络编程-2Email编程-2接收Email
1接收Email协议类型 接收Email:收件人通过MUA软件把邮件从MDA抓取到本地计算机的过程. 1.1 POP3 从MUA到MDA使用最广泛的是协议是POP3 Post Office Proto ...
- CF1097E Egor and an RPG game
最少反链划分数 = 最长链.实现:每次找出所有极大元作为一个反链. 任意长度小于k * (k + 1) / 2的排列都能被划分为不多于k个单调序列.且这是一个紧的上界. 然后这题就可以切了. 题意:给 ...
- vue cnpm run dev 报错,解决方法
执行到 $ cnpm run dev 报如下错,但是实际上 我执行 npm -v 是5.0.4 其原因是nodejs里的版本不对,解决方法
- Android之GridLayout网格布局
1.相关属性 GridLayout网格布局是4.0之后引入的布局方式! android:columnCount="4" //设置列数(4列) android:rowCount=&q ...
- 2019年6月份Github上最热门的开源项目排行出炉,一起来看看本月上榜的开源项目
6月份Github上最热门的开源项目排行出炉,一起来看看本月上榜的开源项目有哪些: 1. the-art-of-command-line https://github.com/jlevy/the-ar ...
- #、%和$符号在OGNL表达式中的作用
#.%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分.在这里笔者简单介绍它们的相应用途. 1.#符号的用途一般有三种. 1)访问非根对象属性,例如示例中的#ses ...