Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]
1
2{《HeadFirst设计模式》之观察者模式 }
3{ 主题与观察者 }
4{ 编译工具 :Delphi7.0 }
5{ 联系方式 :guzh-0417@163.com }
6
7unit uWeatherReport;
8
9interface
10
11uses
12 Classes, SysUtils;
13
14type
15 TObserver = class; { Forward声明,创建两个相互依赖的类 }
16
17 { 抽象主题 }
18 TSubject = class(TObject)
19 procedure RegisterObserver(aObserver: TObserver); virtual; abstract;
20 procedure RemoveObserver (aObserver: TObserver); virtual; abstract;
21 procedure NotifyObserver; virtual; abstract;
22 end;
23
24 { 具体主题 }
25 TWeatherData = class(TSubject)
26 private
27 FObservers: TList;
28 FTemp : Integer;
29 FHumidity : Integer;
30 FPresssure: Integer;
31 public
32 constructor Create;
33 destructor Destroy; override;
34 procedure RegisterObserver(aObserver: TObserver); override;
35 procedure RemoveObserver (aObserver: TObserver); override;
36 procedure NotifyObserver; override;
37 procedure MeasurementsChanged;
38 procedure SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
39 end;
40
41 {**************************************************************************}
42
43 { 抽象观察者 }
44 TObserver = class(TObject)
45 procedure UpDate(Temp, Humidity, Presssure: Integer); virtual; abstract;
46 procedure Display; virtual; abstract;
47 end;
48
49 { 具体观察者 }
50 TCurrentConditionsDisplay = class(TObserver)
51 private
52 FTemp : Integer;
53 FHumidity : Integer;
54 FWeatherData: TSubject;
55 public
56 constructor Create(aWeatherData: TSubject);
57 destructor Destroy; override;
58 procedure UpDate(aTemp, aHumidity, aPresssure: Integer); override;
59 procedure Display; override;
60 end;
61
62implementation
63
64{ TWeatherData }
65
66constructor TWeatherData.Create;
67begin
68 FObservers := TList.Create;
69end;
70
71destructor TWeatherData.Destroy;
72begin
73 FObservers.Clear;
74 FreeAndNil(FObservers);
75 inherited Destroy;
76end;
77
78procedure TWeatherData.MeasurementsChanged;
79begin
80 NotifyObserver;
81end;
82
83procedure TWeatherData.NotifyObserver;
84var
85 i: Integer;
86 aObserver: TObserver;
87begin
88 for i := 0 to FObservers.Count - 1 do
89 begin
90 aObserver := TObserver(FObservers.Items[i]);
91 aObserver.UpDate(FTemp, FHumidity, FPresssure);
92 end;
93end;
94
95procedure TWeatherData.RegisterObserver(aObserver: TObserver);
96begin
97 FObservers.Add(aObserver);
98end;
99
100procedure TWeatherData.RemoveObserver(aObserver: TObserver);
101var
102 i: Integer;
103begin
104 i := FObservers.IndexOf(aObserver);
105 if (i >= 0) then
106 FObservers.Remove(aObserver);
107end;
108
109procedure TWeatherData.SetMeasurements(aTemp, aHumidity, aPresssure: Integer);
110begin
111 FTemp := aTemp;
112 FHumidity := aHumidity;
113 FPresssure := aPresssure;
114 MeasurementsChanged;
115end;
116
117{ TCurrentConditionsDisplay }
118
119constructor TCurrentConditionsDisplay.Create(aWeatherData: TSubject);
120begin
121 FWeatherData := aWeatherData;
122 aWeatherData.RegisterObserver(Self);
123end;
124
125destructor TCurrentConditionsDisplay.Destroy;
126begin
127 inherited Destroy;
128end;
129
130procedure TCurrentConditionsDisplay.Display;
131begin
132 Writeln('Current Conditions: ', FTemp, ' degrees and ',
133 FHumidity, '% humidity.');
134end;
135
136procedure TCurrentConditionsDisplay.UpDate(aTemp, aHumidity,
137 aPresssure: Integer);
138begin
139 FTemp := aTemp;
140 FHumidity := aHumidity;
141 Display;
142end;
143
144end.
1
2{《HeadFirst设计模式》之观察者模式 }
3{ 客户端 }
4{ 编译工具 :Delphi7.0 }
5{ 联系方式 :guzh-0417@163.com }
6
7program pWeatherReport;
8
9{$APPTYPE CONSOLE}
10
11uses
12 SysUtils,
13 uWeatherReport in 'uWeatherReport.pas';
14
15var
16 aWeatherData: TWeatherData;
17 aCurrentConditionsDisplay: TCurrentConditionsDisplay;
18
19begin
20 aWeatherData := TWeatherData.Create;
21 aCurrentConditionsDisplay := TCurrentConditionsDisplay.Create(aWeatherData);
22
23 aWeatherData.SetMeasurements(80, 65, 30);
24
25 FreeAndNil(aWeatherData);
26 FreeAndNil(aCurrentConditionsDisplay);
27
28 Readln;
29end.
运行结果:
Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]的更多相关文章
- 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代码---适配器模式之TurkeyAdapter[转]
适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类 } 4{ 编译工具: Delphi7.0 } 5{ E- ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
1 2{<HeadFirst设计模式>之装饰模式 } 3{ 本单元中的类为被装饰者 } 4{ 编译工具: Delphi7.0 } 5{ E-Ma ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]
1 2{<HeadFirst设计模式>之命令模式 } 3{ 本单元中的类为命令的接收者 } 4{ 编译工具 :Delphi7.0 } 5{ 联 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]
一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口 } ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]
1 2 {<HeadFirst设计模式>工厂模式之抽象工厂 } 3 { 抽象工厂的产品 } 4 { 编译工具:Delphi7.0 ...
随机推荐
- hysbz3676 回文串 回文自动机
回文自动机模板题 头铁了一下午hdu6599,最后发现自己的板有问题 先放这里一个正确性得到基本确认的板,过两天肝hdu6599 #pragma GCC optimize(2) #include< ...
- 基于UDP协议的套接字编程
基于udp协议的套接字编程 UDP是无链接的,先启动那一端都不会报错 UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到 一般不用与传输大数据 虽然没有粘包问题,但是不能 ...
- CSS 继承和优先级
CSS继承性 CSS属性继承:外层元素的样式,会被内层元素进行继承. 多个外层元素的样式,最终都会“叠加”到内层元素上. 什么样的CSS属性能被继承呢? CSS文本属性都会被继承的: color. f ...
- XJOI夏令营501-511NOIP训练14——好朋友
传送门:QAQQAQ 题意:noip2011就要来了,W校的同学们不仅看重这次比赛,更看重noip2011和谁住在同一个房间.同学之间的关系好坏可以用一个亲密值表示,亲密值越大,两个同学关系越好.小A ...
- Newtonsoft.Json高级篇:TypeNameHandling设置
原文:Newtonsoft.Json高级篇:TypeNameHandling设置 此示例使用TypeNameHandling 设置在序列化JSON和读取类型信息时包含类型信息,以便在反序列化JSON时 ...
- LaTeX的安装
1 下载与安装 下载地址. 选择清华TUNA开源镜像, 选择Full版本, 点击下载,按照提示安装,没有坑,就没有截图. 2 简单使用流程 1) 首先下载对应的LaTeX模板(从会议或者期刊网站上下载 ...
- C#窗体代码相关笔记
获取ComboBox下拉列表的所有选项值 ArrayList al = new ArrayList(); foreach (string item in this.comboBox2.Items) { ...
- UMP系统功能 读写分离
- hdu5952 Counting Cliques 技巧dfs
题意:一个有N个点M条边的图,球其中由S个点构成的团的个数.一个团是一个完全子图. 没有什么好办法,只有暴力深搜,但是这里有一个神奇的操作:将无向图转为有向图:当两个点编号u<v时才有边u-&g ...
- Luogu P2484 [SDOI2011]打地鼠(模拟+前缀和)
P2484 [SDOI2011]打地鼠 题意 题目描述 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地 ...