设计模式、用Delphi描述-->Observer模式

观察者模式delphi代码 观察者模式最好的诠释 模式编程中的观察者模式delphi代码 立即下载

Observer 模式

起源

Delphi中的Observer模式在基本Observer模式进行了扩展。更多Observer模式的资料请参 [Gam+, pages 293..303]

目的

定义一个对象间的一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象者得到通知并自动更新

动机

将一个系统分割成一系列相互协作的类有一定的副作用:必须给护相关对象间的一致性。我们不希望为了维扩一致性而使各类紧密耦合,因为这样降低了它们的重用性。[Gam+, p293].

Delphi的事件(实际的方法地址)让你有一个处理这些问题的好的结构,事件让你消除耦合并更好的耦合,比如:事件TButton.OnClick被分派去完成相关的工作。但类并不保存对事件句柄的引用。在observer模式中,分派事件的类称为目标对象(subject),而控制事件的类称为观察者(observer)

所在Delphi的事件更好的消除类的耦合,如果你想对多个事件进行控制,引用observer模式,你可以进立一对多的通知机制。一个目标可以有任意多个观察者。所有的观察者都会目标的状态改变时接受通知。观察者接到通知后,立即查询目标对象,以保持与目对象的同步。

这种交互也称为发布—订阅,目标是通知的发布者。它发现通知时并不需要知道谁是它的观察者。可以有任意数目观察者订阅并接收通知。

应用

这个observer模式应用会带给你Delphi事件机制在处理类耦合优势。一对多的结构通过registering和un-registering来注册观察者。一对多的机制实际应用在的迭代器的基础。

假设你有一个Tsubject类定义了有意义的行为。先看看一段observer模式的演示代码:

 

type

  TSubject = class (TObject)

  private

    FObservers: TList;

  public

    procedure RegisterObserver(Observer: TSubjectObserver);

    procedure UnregisterObserver(Observer: TSubjectObserver);

  end;

 

  TSubjectObserver = class (TComponent)

  private

    FEnabled: Boolean;

  published

    property Enabled: Boolean read FEnabled write FEnabled; default True;

  end;

 

有上面的接口中:

·      一个注册机制用于为Tsubject注册观察者。

¨    FObservers: TList;存贮已注册的观察者。

¨    RegisterObserver(..)用于注册观察者,并增加到Fobservers。

¨    UnregisterObserver(..)用于注消观察者,并从Fobservers移去相关对象。

 

·      observer模式还需创建一个新的类TSubjectObserver

¨    此类为Tcomponent的后代。

¨    .一个Enabled属性设置观察的开与关。.

 

下面的observer模式的实际应:

 

procedure TSubject.RegisterObserver(Observer: TSubjectObserver);

begin

  if FObservers.IndexOf(Observer) = -1 then

    FObservers.Add(Observer);

end;

 

procedure TSubject.UnregisterObserver(Observer: TSubjectObserver);

begin

  FObservers.Remove(Observer);

end;

 

上观的实现支持了对观察者的注册部分。那一对多通知机制在哪里呢。实际的一对多通知应用,你可以为Tsubject定义一个Change方法来通知它的注册的观察者,观察者可以定义一个OnChange的事件属性来处理调度。代码如下:

type

  TSubject = class (TObject)

  private

    FObservers: TList;

  protected

»   procedure Change;     {调用此方法来分派通知}

  public

    procedure RegisterObserver(Observer: TSubjectObserver);

    procedure UnregisterObserver(Observer: TSubjectObserver);

  end;

 

  TSubjectObserver = class (TComponent)

  private

    FEnabled: Boolean;

»   FOnChange: TNotifyEvent;

  protected

»   procedure Change;

  published

    property Enabled: Boolean read FEnabled write FEnabled;

»   property OnChange: TNotifyEvent read FOnChange write FOnChange;

  end;

 

implementation

 

procedure TSubject.Change;

var

» Obs: TSubjectObserver;

» I: Integer;

begin

» for I := 0 to FObservers.Count - 1 do

» begin

»   Obs := FObservers[I];

»   if Obs.Enabled then Obs.Change;

» end;

end;

 

procedure TSubject.RegisterObserver(Observer: TSubjectObserver);

begin

  if FObservers.IndexOf(Observer) = -1 then

    FObservers.Add(Observer);

end;

 

procedure TSubject.UnregisterObserver(Observer: TSubjectObserver);

begin

  FObservers.Remove(Observer);

end;

 

procedure TSubjectObserver.Change;

begin

» if Assigned(FOnChange) then FOnChange(Self);

end;

 

在上面的实现代码中:

·      Tsubject的Change方法迭代所有注册的观察者,并调用每个观察者的Change方法,一个对多通知的实现。

·      观察者的Enabled属性决定它是或接受通知

·      TsubjectObserver的OnChange事件真正的处理同步等操作。

Delphi实例

正在组织

//很多摘自《设计模式》

 

华为[ENSP]—— 实验二、三层交换和ARP的工作原理 华为[ENSP]三层交换和ARP的工作原理 阅读详情

相关推荐

解决VMWare ESXi PCIe直通显卡导致的DevicePowerOn启动故障

本文详细解析了VMWare ESXi中PCIe直通显卡导致的DevicePowerOn启动故障,重点分析了MMIO空间不足的根本原因,并提供了完整的解决方案。通过修改.vmx文件中的关键参数,如pciPassthru.64bitMMIOSizeGB,可以有效解决显存分配问题。文章还涵盖了硬件兼容性检查、性能调优技巧及大规模部署的实战案例,帮助用户彻底解决显卡直通难题。

weixin_42537919的博客 575

Delphi 观察者模式

RAD Studio 10.2.3 测试√ 运行结果: 使用方法: procedure TDesignPattern.Button_ObserverPatternClick(Sender: TObject); var mObj001: TObserverObject_001; mObj002: TObserverObject_002; begin // 被观察者001进行创建 mObj001 := TObserverObject_001.Create; Memo_Log.Lines

小印丶的笔记 388

Synopsys SCL许可证服务器搭建详解:从安装到生成.dat文件

本文详细解析了Synopsys SCL许可证服务器的完整搭建流程,从系统环境准备、SCL安装到生成.dat文件。重点阐述了如何正确获取HOST ID、配置License文件以及调试常见故障,为数字芯片设计工程师提供了一套从零到一的实战避坑指南,确保EDA工具链稳定运行。

weixin_29306011的博客 612

用Delphi实现观察者模式(Observer模式)

用Delphi实现观察者模式(Observer模式) 作者:陈省 有一段时间我对IE编程非常感兴趣,于是就在Yahoo加入了一个IE编程的兴趣小组,只要有人在兴趣小组中提出或者回答了一个问题,发布的信息就会发送给所有兴趣小组的注册用户,这种模式实际上就是发布-订阅模式,又称观察者模式。 观察者模式中有两个角色,其中一个是目标,另外一个是观察者,对于兴趣小组来说,注册用户就是观察者,而兴趣小组本身是目标。兴趣小组必须提供注册的机制,这样兴趣小组才能知道用户的邮件地址,可以维护一个订户的邮件列表,能.

男神的专栏 320

ROS 入门教程:小乌龟仿真器和基础操作

小乌龟仿真器和ros基础操作

zlflll的博客 4125

Win7运行豆包桌面版的兼容性原理与实操方案

Windows 7作为已停止主流支持的操作系统,其与现代Electron应用的兼容性问题本质是API层面的系统调用断层。Electron 28+依赖的GetSystemTimePreciseAsFileTime、SetThreadDescription等Windows 10专属API,在Win7 SP1中天然缺失,导致‘无法定位程序输入点’等典型错误。解决路径并非简单打补丁,而是需理解底层ABI差异、补丁堆叠边界及动态API转发机制。关键技术价值在于通过兼容层(如VxKex NEXT)或运行时降级(Elec

weixin_33290540的博客 1351

delphi下的MVC架构-eMVC

Easy MVC开发人员指南 翻译:丁士锋 东莞虎门镇居岐 1.Introduction 1.1 What's Easy MVC Easy MVC or eMVC是一个轻量级MVC框架,为Delphi程序员设计来开发Windows应用程序。 1.2为什么我们需要eMVC? Model-View-Controller(MVC)成为一个通...

weixin_30500289的博客 422

LVGL 实战:虚拟列表与对象复用机制在嵌入式GUI中的性能优化

本文深入探讨LVGL虚拟列表与对象复用机制在嵌入式GUI中的性能优化实践。通过复用机制动态管理UI对象,大幅降低内存占用,实现无限滚动列表的流畅体验。文章详细解析核心算法、内存优化策略及跨平台适配技巧,帮助开发者在资源受限设备上高效处理大量数据展示。

rice5的博客 1106

Delphi模式编程

Delphi模式编程

qqrrjj2011的博客 1512

livox avia平台搭建

livox雷达数据采集平台搭建

Shilong的博客 1310

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安全。本文从硬件选型、电路设计到软件实现提供了完整的实验室安全监测系统方案,可根据实际需求调整传感器类型和通信方式,适用于科研、教学等场景的环境安全防护。:可增加继电器模块控制通风设备或切断电源,集成 ZigBee 组网实现多实验室联动监测。

weixin_42300449的博客 1285

观察者模式

  观察者模式 其实就相当于 出版者+订阅者 的关系,当有新闻时,订阅者就会得到来自出版者那边的报纸;当然,若不想订阅报纸,取消订阅即可,之后出版者也就不会再发报纸给你;反之,若想订阅报纸,注册为订阅者即可。   观察者模式的定义:观察者模式定义了对象之间的一对多依赖关系【主题(出版者)与观察者(订阅者)】,观察者依赖于此主题,只要主题状态一有变化,观察者就会被通知,根据通知的风格,观察者可能因...

weixin_30500473的博客 118

华为OD新系统真题-最小极差分组(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【最小极差分组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【最小极差分组】多语言题解。

qq_45776114的博客 588

Delphi中的观察者模式运用

不知道从哪个版本开始,Delphi包含了一个System.Messaging单元,实现了观察者模式(也就是发布/订阅模式),运用于消息传递,极大方便了编程。 提供了一个消息管理器TMessageManager,默认实现了一个DefaultManager.一般运用,直接用这个DefaultManager就够了,当然也可以自己实现。 这里的消息可以包含任何东东,看看其消息定义: TMessa...

weixin_33748818的博客 298

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:显式地指定感兴趣的改变

示例:显式地指定感兴趣的改变 说明: 你可以扩展目标的注册接口,让各观察者注册为仅对特定事件感兴趣,以提高更新的效率。当一个事件发生时,目标仅通知那些已注册为对该事件感兴趣的观察者。 代码:   unit uAspects; interface uses     SysUtils, Classes, Dialogs; type     TAspect = (apCa

starsky2006的专栏 687

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Delphi语言的游戏设计模式

设计模式是针对特定问题的最佳解决方案,是经验丰富的开发者总结出的方法和技巧。在游戏开发中,设计模式能够帮助我们更直观地理解系统结构,提升团队协作效率,并减少后期维护的成本。在Delphi语言的游戏开发中,设计模式为我们提供了一种高效的开发手段。通过合理的模式选择和实现,我们能够显著提高代码的可读性、可维护性与可扩展性。希望本文对游戏开发者在Delphi中运用设计模式有所帮助,可以更好地应对游戏项目中的挑战。设计模式并非万无一失,在实际运用时,开发者需要根据具体的项目需求、团队技术积累等因素进行灵活调整。

2501_91390782的博客 601

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Delphi语言的面向对象编程

在Delphi中,我们使用关键字class来定义类。同时,类的构造函数和析构函数也可以被定义,以帮助实例化对象和清理资源。end;beginend;begin// 清理资源inherited;end;beginend;```在这个例子中,我们定义了一个名为TPerson的类,包含了两个私有字段FName和FAge,以及一个构造函数、一个析构函数和一个方法。

2501_91366750的博客 380

【delphi11】delphi进阶【四、面向对象编程(OOP)】

面向对象编程(OOP)是现代编程中的一个核心概念,尤其在使用像 Delphi 这样的面向对象的语言时。它基于三个主要原则:封装、继承和多态。我们将通过 Delphi 编程语言来探讨这些概念。

Bobowen的博客 1928

Delphi XE2 之 FireMonkey 入门(2)

FireMonkey 的控件都是自己绘制的(而不是基于系统组件), 我想它们应该是基于一些基本图形; 就从基本图形开始吧. FMX.Objects 单元给出的类: TShape //基本图形的基类 TLine TRectangle TRoundRect TCalloutRectangle TEllipse TCircle TPie TArc TPath TTex...

weixin_34244102的博客 241

《GOF设计模式》—中介者 (MEDIATOR)—Delphi源码示例:Colleague—Mediator通信(使用观察者模式)

示例:Colleague—Mediator通信(使用观察者模式) 说明: 当一个感兴趣的事件发生时,Colleague必须与其Mediator通信。一种实现方法是使用观察者模式(Observer),将Mediator实现为一个Observer,各Colleague作为Subject,一旦其状态改变就发送通知给Mediator。Mediator作出的响应是将状态改变的结果传播给其他的Colleague。 代码: unit uObserver;

starsky2006的专栏 514

delphi(XE2)实现图片异形窗体,支持摆放控件

网上有较多使用UpdateLayeredWindow函数实现美化的图片异形窗体的代码,一般使用此场景时,对软件界面要求较高。但是实现了图片窗体后,在窗体中摆放不了其他控件,导致这个功能很鸡肋。为解决此问题,本博文中的案例使用两个窗体搭配使用,图片窗口作为背景窗体,放置控件的窗口作为功能性窗体,功能性窗口全透明展示,可实现我们预设的目标。

yueyun889的专栏 1714

《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:封装复杂的更新语义

示例:封装复杂的更新语义 说明: 当目标和观察者间的依赖关系特别复杂时,可能需要一个维护这些关系的对象。我们称这样的对象为更改管理器(ChangeManager)。它的目的是尽量减少观察者反映其目标的状态变化所需的工作量。例如,如果一个操作涉及到对几个相互依赖的目标进行改动,就必须保证仅在所有的目标都已更改完毕后,才一次性地通知它们的观察者,而不是每个目标都通知观察者。 ChangeManager是一个中介者模式(Mediator)的实例。通常只有一个ChangeMa

starsky2006的专栏 581

Design Pattern----23.Behavioral.Observer.Pattern (Delphi Sample)

Intent Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. Encapsulate the core (or common or engine)...

weixin_30359021的博客 197

《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:时钟

示例:时钟 说明: ClockTimer是一个用于存储和维护一天时间的具体目标。它每秒钟通知一次它的观察者。 我们定义一个DigitalClock类来显示时间。它从一个用户界面工具箱提供的Widget类继承了它的图形功能。 代码: 迭代器uListIterator unit uListIterator; interface uses classes; type

starsky2006的专栏 557
上一篇: 设计模式、用Delphi描述-->Reference Count pattern
下一篇: 设计模式、用Delphi描述-->Abstract Factory模式
programlover
博客等级 码龄26年 1粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值