正确的面向对象设计,用于观察/记录方法的发生

时间:2011-11-24 00:31:26

标签: c# oop design-patterns

广义上的问题:

我有一个对象,它有一个执行长迭代过程的方法,我有一个第二个对象,用于记录/监视那个长迭代过程中发生的事情。观察和监控迭代过程进度的最佳设计/设计模式是什么?

我正在处理的具体问题:

我有一个RandomWalker对象,其方法InitiateRandomWalk()会导致随机漫步者走几千步。我还有一个HeatMaps对象,它描述了一组热图图像,这些图像通过分析随机行走路径的每一步来呈现。

我不想等到InitiateRandomWalk()方法完成后才将路径数据传递给Heatmaps对象并开始渲染热图。相反,我希望我的Heatmaps对象能够观察并记录随机游走数据。

一些可能性:

  • 我可以制作热图日志记录方法publicstatic,并在InitiateRandomWalk()方法中调用该方法,但这样做会很糟糕。
  • 我可以让InitiateRandomWalk()返回IEnumerableyield return每一步,然后将每一步传递给Heatmaps
  • 我可以将Heatmaps对象作为参数传递给InitiateRandomWalk()方法。

哪种设计/设计模式最好?

4 个答案:

答案 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写入文件。你基本上在做模型视图控制器模式,但可能没有控制器