正确的面向对象设计,用于观察/记录方法发生的事件
本文关键字:方法 记录 事件 观察 面向对象设计 用于 | 更新日期: 2023-09-27 18:15:38
广义的问题:
我有一个对象,它的方法执行一个长迭代过程,我有第二个对象,它被设计用来记录/监控这个长迭代过程中的事件。观察和监控迭代过程进展的最佳设计/设计模式是什么?
我正在研究的具体问题:
我有一个RandomWalker
对象,它有一个方法InitiateRandomWalk()
,它导致随机漫步器走数千步。我还有一个HeatMaps
对象,它描述了一组热图图像,这些图像是通过分析随机行走路径的每一步来渲染的。
我不想等到InitiateRandomWalk()
方法完成后才将路径数据传递给Heatmaps
对象并开始渲染热图。相反,我希望我的Heatmaps
对象在随机漫步数据发生时观察并记录数据。
- 我可以让热图记录方法
public
和static
,并从InitiateRandomWalk()
方法中调用该方法,但这将是糟糕的设计。 - 我可以有InitiateRandomWalk()返回
IEnumerable
和yield return
每一步,然后传递每一步Heatmaps
。 我可以将
Heatmaps
对象作为参数传递给InitiateRandomWalk()
方法。哪种设计/设计模式是最好的?
从yield return关键字结构的使用来看,我假设您正在使用c#。在响应式框架中使用这种结构是解决问题的完美方法(尽管有些高级)。下面是如何在实际中使用它的一个很好的概述。
另一种选择是简单地在RandomWalker上声明一个StepTaken事件。HeatMap将订阅该事件,InitiateRandomWalk将在每次生成一个步骤时触发该事件。
响应式扩展是专门为这个场景设计的:
http://msdn.microsoft.com/en-us/data/gg577609显然RandomWalk代码不应该知道任何关于HeatMaps的信息,因为这只是您想要查看输出数据的一种任意方式。我会选择选项2,或者其他一些非常松散的耦合,如RandomWalk写入文件,而HeatMap视图读取文件。你基本上是在做模型-视图-控制器模式,但可能没有控制器
明显的设计模式是Observer。
维基百科上关于该模式的文章非常完整。这里有一篇文章,用一些c#代码示例来解释它。
在这种情况下,模式可能有些过度,但会让您得到两个解耦的类,并且可以轻松地添加不同的方法来处理随机漫步输出。
本质上,你的热图充当随机漫步主题的观察者。这基本上归结为你的第三个选择,将HeatMap传递给随机漫步。
实现方面,最简单的方法是让HeatMap类注册自己(可能通过传递Func委托,或者简单地通过使用事件)与随机漫步类。