设计模式:选择哪一个?

时间:2010-09-28 13:13:15

标签: c# .net design-patterns

首先,这只是概念,我还没有完成实际编程。情况就是这样:

我有一个A类,它使用Filesystemwatcher来监视文件夹中的更改。 (使用事件)

然后我有一个'Collection Class'B,它有一个A的列表。

现在我想要发生的事情如下,

文件夹发生更改,A检测到此消息并向B发送消息,B将此消息传送到C类。然后,C类开始更新GUI的方法。 (做了哪些改变等等。)

现在我已经在这个问题上进行了很长时间的搜索和思考,但找不到解决方案。但是,我发现了两种设计模式:

调解员和观察员。

作为一名软件工程师,我曾在某种程度上制作了Observer模式,因此我了解了一些基础知识。

现在回答我的问题:

  • 在这种情况下最适合使用哪种模式?

  • 如何将B发送给C?

  • 我是否需要自定义事件/代表才能将A传输数据发送给B,或者我可以使用内置事件吗?

P.S。:我正在使用C#作为我的编程语言。

编辑:感谢所有人帮助我,投票正在进行中。

5 个答案:

答案 0 :(得分:5)

观察者很好。您可以使C成为B的观察者(以便B将事件从A发送到C),或使C直接监听A(这可能是更糟糕的选择,因为它创建了从C到A的直接依赖)。

请注意,这基本上是Model-View-Controller的变体,其中A是模型,C是视图。现在B是否会成为一个合适的控制器在很大程度上取决于它的职责:如果它只是一个A的集合,那么将它作为一个控制器并不是一个好主意。没有关于你的课程和职责的更多细节,很难说更多。

答案 1 :(得分:4)

对于我所做的,有一堆“A”对象将事件异步传递给单个B,然后将该信息传递给单个C.

所以,让B包含并观察A's并让C观察B。

如果你有很多A,你可能希望B在通知C之前对A的事件进行一些收集/缓存。特别是如果C正在为用户界面提供服务。

旁注:不要过度模式化您的软件。尽量保持思想开放,始终找到最简单,最简单的解决方案。只使用适当的模式,而不仅仅是因为它是可能的。我看到很多人投入代理,命令模式,观察者,MVC,调解员等,他们是不必要的。

祝你好运。

答案 2 :(得分:3)

public class A
{
    public event FileSystemEventHandler FileSystemEvent;

    A()
    {
        this.fsw = new FileSystemWatcher();
        this.fsw.OnFileSystemEvent += (sender, e) => 
            { if(this.FileSystemEvent != null) 
                 this.FileSystemEvent(this,e); };
    }
}

public class B
{
    public event FileSystemEventHandler FileSystemEvent;

    B()
    {
        this.RegisterAClasses();
        foreach( A item in this.AClasses )
             item.FileSystemEvent += (sender, e) =>
                 { if(this.FileSystemEvent != null) 
                      this.FileSystemEvent(sender, e) };
    }
}

public class C
{
    C()
    {
        this.RegisterBClass();
        this.BClass.FileSystemEvent += (sender, e) => 
             { /* update gui... */ };
    }
}

(伪代码......)

答案 3 :(得分:1)

我最终使用了几乎相同的方案来演示Reactive Extensions。

RX是观察者模式的形式主义 - 但是被推广为迭代器模式的逆/双。

详细信息和源代码 - http://code.msdn.microsoft.com/RxDemos

答案 4 :(得分:0)

Observer是一个合适的模式。我不明白你为什么这么说:

  

然后我有一个'收集班'B   它有一个A的列表。

因为,对于观察者模式,我认为B应该观察A,所以在A类中,有一些B用于监听A发生的事件(文件夹被更改)。类似地,C类应该观察B,所以在B类中有一些对象C注册用于B的侦听事件。 自定义事件或构建事件的必要性取决于您的类。如果是.NET的类,我认为有一些事件可以通知更改一个dicrectory。如果没有,您应该编写自己的事件/代理。