分享
 
 
 

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

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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实例

正在组织

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有