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. 牛客多校第六场 A Garbage 模拟/签到

    题意: 给你一个字符串,代表一个垃圾都有哪些物质组成,再给你一个字符串,代表a-z代表的物质分别是有害物质,干物质还是湿物质,根据题目的定义,回答是什么垃圾. 题解: 根据题意模拟即可. #inclu ...

  2. csv文件格式

    弱渣今天第一次读Kaggle入门文章,知道train data,test data以及提供的result文件大都是以csv文件格式给出的. csv,全称 Comma-Separated Values, ...

  3. Pycharm中如何加载多个项目同时存在

    原文地址: http://www.cnblogs.com/mrgavin/p/6382406.html 今天在使用Pycharm工具练习Python时遇到一个疑问:在已存有项目A工程的前提下如何新建另 ...

  4. USART 串口

    串口不工作 请逐一检查: 是否正确配置复用IO口(先用RCC_APB2PeriphClockCmd在RCC寄存器中先开启GPIOx的时钟使能,再用 GPIO_Init 进行IO复用配置) 是否正确配置 ...

  5. 按指定规则统计list中数据,groupby用法

    有的情况下,只是想要简单地对list中数据,进行分组,查看,可以考虑使用groupby 代码: # groupby需要排序后才能使用 def gb(num): if 0 <= num < ...

  6. Amazon AWS EC2存储

  7. LuoguP3498 [POI2010]KOR-Beads

    呀呀呀,临走10分钟刷一道水题 然而只是记一下第一次hash被卡 各种模数都被卡了... 本来想打双哈希了,后来皮了一下,模数改成了998244353,然后竟然A掉了 正着hash一遍,反着hash一 ...

  8. Xstream 解析xml文件内容

    刚刚接手的一个项目,接到一个对接用户数据的需求,对方使用的是xml格式来传输文件,特此记下解析该类文件的方法 public interface XmlResolver<T> { XStre ...

  9. DRF初识

    目录 Web API接口 什么是Web API接口 接口四大特征 接口文档的编写测试 restful接口规范 url链接设计 五大请求方式 响应结果 DRF框架安装 基于原生Django实现十大接口 ...

  10. 洛谷 P1941 飞扬的小鸟 (NOIP 2014)

    题面 题解 背包细节题,wa了一片,上升的过程我们可以看做一个完全背包(多重背包好像跑不过去),下降 过程是一个0/1背包,为了避免冲突应该先跑多重,先跑0/1就有可能产生这个点又上升又下降的 非法情 ...