起源
Delphi中的Observer模式在基本Observer模式进行了扩展。更多Observer模式的资料请参 [Gam+, pages 293..303]<o:p></o:p>
目的
定义一个对象间的一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象者得到通知并自动更新<o:p></o:p>
动机<o:p></o:p>
将一个系统分割成一系列相互协作的类有一定的副作用:必须给护相关对象间的一致性。我们不希望为了维扩一致性而使各类紧密耦合,因为这样降低了它们的重用性。[Gam+, p293].<o:p></o:p>
Delphi的事件(实际的方法地址)让你有一个处理这些问题的好的结构,事件让你消除耦合并更好的耦合,比如:事件TButton.OnClick被分派去完成相关的工作。但类并不保存对事件句柄的引用。在observer模式中,分派事件的类称为目标对象(subject),而控制事件的类称为观察者(observer)
所在Delphi的事件更好的消除类的耦合,如果你想对多个事件进行控制,引用observer模式,你可以进立一对多的通知机制。一个目标可以有任意多个观察者。所有的观察者都会目标的状态改变时接受通知。观察者接到通知后,立即查询目标对象,以保持与目对象的同步。
这种交互也称为发布—订阅,目标是通知的发布者。它发现通知时并不需要知道谁是它的观察者。可以有任意数目观察者订阅并接收通知。
应用
这个observer模式应用会带给你Delphi事件机制在处理类耦合优势。一对多的结构通过registering和un-registering来注册观察者。一对多的机制实际应用在的迭代器的基础。<o:p></o:p>
假设你有一个Tsubject类定义了有意义的行为。先看看一段observer模式的演示代码:<o:p></o:p>
<o:p></o:p>
type
TSubject = class (TObject)
private
FObservers: TList;
public
procedure RegisterObserver(Observer: TSubjectObserver);
procedure UnregisterObserver(Observer: TSubjectObserver);
end;
<o:p></o:p>
TSubjectObserver = class (TComponent)
private
FEnabled: Boolean;
published
property Enabled: Boolean read FEnabled write FEnabled; default True;
end;
<o:p></o:p>
有上面的接口中:
· 一个注册机制用于为Tsubject注册观察者。
¨ FObservers: TList;存贮已注册的观察者。
¨ RegisterObserver(..)用于注册观察者,并增加到Fobservers。
¨ UnregisterObserver(..)用于注消观察者,并从Fobservers移去相关对象。
<o:p></o:p>
· observer模式还需创建一个新的类TSubjectObserver
¨ 此类为Tcomponent的后代。
¨ .一个Enabled属性设置观察的开与关。.
<o:p></o:p>
下面的observer模式的实际应:
<o:p></o:p>
procedure TSubject.RegisterObserver(Observer: TSubjectObserver);
begin
if FObservers.IndexOf(Observer) = -1 then
FObservers.Add(Observer);
end;
<o:p></o:p>
procedure TSubject.UnregisterObserver(Observer: TSubjectObserver);
begin
FObservers.Remove(Observer);
end;
<o:p></o:p>
上观的实现支持了对观察者的注册部分。那一对多通知机制在哪里呢。实际的一对多通知应用,你可以为Tsubject定义一个Change方法来通知它的注册的观察者,观察者可以定义一个OnChange的事件属性来处理调度。代码如下:
type
TSubject = class (TObject)
private
FObservers: TList;
protected
» procedure Change; {调用此方法来分派通知}
public
procedure RegisterObserver(Observer: TSubjectObserver);
procedure UnregisterObserver(Observer: TSubjectObserver);
end;
<o:p></o:p>
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;
<o:p></o:p>
implementation
<o:p></o:p>
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;
<o:p></o:p>
procedure TSubject.RegisterObserver(Observer: TSubjectObserver);
begin
if FObservers.IndexOf(Observer) = -1 then
FObservers.Add(Observer);
end;
<o:p></o:p>
procedure TSubject.UnregisterObserver(Observer: TSubjectObserver);
begin
FObservers.Remove(Observer);
end;
<o:p></o:p>
procedure TSubjectObserver.Change;
begin
» if Assigned(FOnChange) then FOnChange(Self);
end;
<o:p></o:p>
在上面的实现代码中:
· Tsubject的Change方法迭代所有注册的观察者,并调用每个观察者的Change方法,一个对多通知的实现。
· 观察者的Enabled属性决定它是或接受通知
· TsubjectObserver的OnChange事件真正的处理同步等操作。
分享到:
相关推荐
Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
Observer模式,也被称为“发布-订阅”模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Observer模式是实现...
在Android开发中,Observer模式是一种常见的设计模式,用于实现对象之间的通信和状态更新。Observer模式的核心思想是"一对多"的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...
### Observer模式代码实现 #### 观察者模式简介 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...
在多年的图像处理工作中, 深感有必要自己开发一个开发一个集图像的显示, 变换, 各种处理分析测试的工具平台, 这就是Observer. 取名为Observer, 是因为我觉得图像的处理与分析依赖于对图像的细致观察. Observer的...
观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...
"Observer(观察者)"和"Reactor(反应器)"是两种广泛应用于并发和事件驱动编程的设计模式。 Observer模式的核心在于定义了一对多的依赖关系,当一个对象(主题)的状态发生改变时,所有依赖于它的对象都会被自动...
"Observer"模式是设计模式的一种,属于行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 Observer模式的核心概念在于发布(Publish)和...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...
在这个Observer_exsample_observer案例中,我们关注的是如何使用Simulink来设计和仿真一个状态观测器,特别是针对弹簧阻尼系统的应用。 首先,让我们了解一下状态观测器的基本原理。在控制系统中,我们通常只能获得...
"Observer"模式是其中的一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这个"Observer例子"中,我们将探讨如何在实际编程中应用...
干扰观测器(Disturbance Observer, DO)是一种用于提高控制系统性能的技术手段。它通过对系统输出信号进行处理来估计外界干扰,并将这些估计值反馈到控制器中,从而实现对干扰的有效抑制。DO技术在现代控制领域中...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在.NET框架中,我们可以使用不同的方式...
### Observer与Command模式在VTK类库设计中的应用研究 #### 一、引言 VTK(Visualization Toolkit)是一套开源的三维可视化开发库,在国外得到了广泛应用,而在国内的研究相对较少,导致其应用受到一定限制。为了...
- **具体观察者类(Concrete Observer Classes)**:实现观察者接口,订阅状态变化并处理通知。 通过分析和学习这些示例代码,开发者可以更好地理解和应用这两种设计模式,提升他们的编程技巧,同时也能提高软件的...
本篇将深入探讨`artisan observer maker`,它是Laravel提供的一个命令,用于简化创建观察者类的过程。 观察者模式是一种设计模式,它允许我们定义一组订阅者,当对象的状态发生变化时,这些订阅者会自动收到通知并...
在观察者模式中,通常有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它持有一个观察者列表,并负责通知这些观察者状态的变化。观察者是依赖主题的对象,当接收到主题的通知时,它们会...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...