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[转]的更多相关文章

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

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

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

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

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

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

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]

    适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...

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

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

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]

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

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

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

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]

    一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口                            } ...

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

随机推荐

  1. (转)JNI入门教程之HelloWorld篇 .

    转: http://blog.csdn.net/mingjava/article/details/180946 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...

  2. Mybatis笔记 – insert语句中主键的返回

    在DBMS中可以使用insert语句显示指定自增主键值,但Mybatis中不可,即使指定了也无效,可以使用特殊的方式返回主键. 一.自增主键返回         mysql自增主键执行insert提交 ...

  3. JS 基本的介绍

    JS中的注释   HTML的注释:<!—注释内容-->   CSS注释:/* 注释 */   JavaScript的注释:// 或 /*  多行注释 */ 变量 1.变量的概念 变量是变化 ...

  4. 全局CSS设置

    全局CSS设置 1.清除所有的标记的内外边距 body,ul,li,a,img,p,input{ margin:0; padding:0; } 2.去除项目符号或编号前面的符号 ul,ol,li{ l ...

  5. icon 的前生今世 & iconfont 的晋级之路

      布吉岛为啥起了个这么文(dou)艺(bi)的名字,话不多说,开始总结

  6. 9.2 sun.py

    import requests from bs4 import BeautifulSoup url = 'http://wz.sun0769.com/index.php/question/reply? ...

  7. <day006>bootstrap的简单学习 + 轮播图

    任务1:bootstrap的简单学习 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta c ...

  8. selenium基础(获取验证信息-断言)

    获取验证信息 实际结果与预期结果进行比较称之为断言 通过获取title.URL.text等信息进行断言 text方法用于获取标签对之间的文本信息 from selenium import webdri ...

  9. SQL语句的四种连接

    SQL的四种连接查询 内连接 inner join 或者 join 外连接 左连接   left join 或者 left outer join 右连接  right join 或者 right ou ...

  10. YXcms前台注入(有限制但可以绕过)

    这个cms很久前做过代码审计,很多问题,但是经过这么长时间,现在安全性提高了不少,这几天看了下,基本没有什么特别大的问题了(不包含后台). 在yxcms/protected/apps/member/c ...