广义上的问题:
我有一个对象,它有一个执行长迭代过程的方法,我有一个第二个对象,用于记录/监视那个长迭代过程中发生的事情。观察和监控迭代过程进度的最佳设计/设计模式是什么?
我正在处理的具体问题:
我有一个RandomWalker
对象,其方法InitiateRandomWalk()
会导致随机漫步者走几千步。我还有一个HeatMaps
对象,它描述了一组热图图像,这些图像通过分析随机行走路径的每一步来呈现。
我不想等到InitiateRandomWalk()
方法完成后才将路径数据传递给Heatmaps
对象并开始渲染热图。相反,我希望我的Heatmaps
对象能够观察并记录随机游走数据。
一些可能性:
public
和static
,并在InitiateRandomWalk()
方法中调用该方法,但这样做会很糟糕。IEnumerable
和yield return
每一步,然后将每一步传递给Heatmaps
。Heatmaps
对象作为参数传递给InitiateRandomWalk()
方法。哪种设计/设计模式最好?
答案 0 :(得分:2)
从yield return关键字构造的用法,我假设你正在使用C#。将该构造与Reactive Framework一起使用是一种完美的方法(虽然有些先进),可以解决您的问题。 Here's a good overview如何在行动中使用它。
另一种选择是简单地在RandomWalker上声明一个事件StepTaken。 HeatMap会订阅该事件,InitiateRandomWalk会在每次生成一个步骤时触发该事件。
答案 1 :(得分:1)
Reactive Extensions专为此方案设计:
http://msdn.microsoft.com/en-us/data/gg577609
另一种选择是简单地向RandomWalker添加一个事件。
答案 2 :(得分:0)
明显的设计模式是观察者。
模式上的wikipedia article非常完整。 Here是一篇使用一些C#代码示例解释它的文章。
在这种情况下,模式可能有点过分,但会使两个类分离,并且可以轻松地添加不同的方法来处理随机游走输出。
基本上你的HeatMap充当随机游走主题的观察者。这基本上归结为将HeatMap传递给随机游走的第三种选择。
实现明智的最简单的方法是让HeatMap类自己注册(可能通过传递一个Func委托,或者只是通过使用事件)和随机游走类。
答案 3 :(得分:0)
当然,RandomWalk代码不应该知道关于HeatMaps的任何信息,因为这只是你想要查看输出数据的一种任意方式。我要么选择2,要么使用其他一些非常松散的耦合,比如在HeatMap视图读取文件时,RandomWalk写入文件。你基本上在做模型视图控制器模式,但可能没有控制器