在Delphi中实现观察者模式的最佳方法

6

我发现Delphi有不同的观察者模式实现,比如:Sourcemaking Design PatternsDelphi Hobbyist

总的来说,在Delphi中实现观察者模式的最佳方法是使用接口,因为代码更易读。


接口的作用不在于代码变得更易读,而在于代码变得/更加解耦。 - Marjan Venema
这里有另一种实现方法可以方便使用:http://blogs.teamb.com/joannacarter/2004/06/30/690 - Kenneth Cochran
2个回答

8
没有“好”的或“最佳”的实现模式的方式。 您选择的实现取决于您想如何使用它。
例如,您还可以使用泛型功能(自Delphi 2009以来可用)来简化许多模式的使用。
如果您使用Pre Delphi-3版本,或者想避免引用计数,则无法使用接口。 (当与传统的所有者/拥有者基于生命周期管理混合使用时,引用计数可能会打开一个新的问题;请确保从正确的祖先 - 如TInterfacedObject - 派生公开接口的类,并注意您的生命周期管理)。
除了关于如何实现观察者模式的“纯”问题之外,还可以识别在Delphi中实现观察者模式的类。
例如TDataSet/TDataSource也实现了观察者模式
整个数据感知控件的概念都依赖于它,通过TDataLink进行绑定。

我编写了一个基于TDataLinkTDataLinkReflector组件,它将TDataLink中的所有虚拟方法反映到TDataLinkReflector中的事件中。

基于TDataLinkReflector,我编写了TDataAwareControlController组件,它可以根据TDataSet、其TFields和连接到TDataSet的TDataSource对数据感知控件进行各种有趣的操作(如只读、必填等着色)。
但是,即使是看似简单的事件也可以被视为基于该模式(尽管事件是单播的,因此只有一个观察者可以观察一个事件)。
另一个实现此功能的类是TApplicationEvents;每个实例都可以让您监听TApplication上的任何事件。
希望这能让您了解观察者模式在Delphi中的使用情况。
--jeroen
PS:任何对我编写的组件感兴趣的人可能想查看此处提到的CodeRage视频

1
很遗憾,链接已失效。请问您能否再次提供CodeRage的链接? - GBg
1
很遗憾,在Borland/Inprise/Embarcadero删除内容之前,论坛服务器没有被归档。我不再有视频链接,但你可以在https://github.com/jpluimers/Conferences/tree/master/2009/DelphiLive.2009/Smarter-code-with-databases-and-data-aware-controls上获取代码。 - Jeroen Wiert Pluimers
1
如果codecentral服务器正常运行,您可能可以通过https://wiert.me/2009/04/24/spoken-coderage-iii-december-1-5-2008-on-delphi-database-and-xml-related-topics/获取视频。 - Jeroen Wiert Pluimers
1
我已经在FMX中创建了一个带有内部列表的组件(派生自TControl)。我希望能够从数据源填充它的列表。我希望观察者模式和您的视频能够帮助我。 - GBg
1
我接下来几周真的很忙。如果你找不到这个视频,请通过Twitter或我的博客告诉我(请查看我的个人资料:https://stackoverflow.com/users/29290/jeroen-wiert-pluimers?tab=profile)。 如果你找到了这个视频,请在评论中放上链接,以帮助其他可能想要稍后查看的人。 - Jeroen Wiert Pluimers
显示剩余3条评论

2

链接已经损坏了 :'( - ramiromd
2
这里有一个缓存副本:https://web.archive.org/web/20050204002436/http://itte.no/delphi/ObservedDemo.htm ;) - iPath ツ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接