Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计模式:选择哪一种?_C#_.net_Design Patterns - Fatal编程技术网

C# 设计模式:选择哪一种?

C# 设计模式:选择哪一种?,c#,.net,design-patterns,C#,.net,Design Patterns,首先,这只是一个概念,我还没有真正的编程完成。情况就是这样: 我有一个类,它使用Filesystemwatcher监视文件夹中的更改。(使用事件) 然后我有一个“收集类”B,它有一个a的列表 现在我想做的是 文件夹发生更改,A检测到此情况并向B发送消息,B将此消息传输到C类。C类随后开始更新GUI的方法。(进行了哪些更改等) 现在我已经在这个问题上搜索和思考了很长时间,但找不到解决方案。但是,我发现了两种设计模式: 调解人和观察员 作为一名软件工程师,我在某种程度上曾经制作过观察者模式,因此我了

首先,这只是一个概念,我还没有真正的编程完成。情况就是这样:

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

然后我有一个“收集类”B,它有一个a的列表

现在我想做的是

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

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

调解人和观察员

作为一名软件工程师,我在某种程度上曾经制作过观察者模式,因此我了解其中的一些基础知识

现在回答我的问题:

  • 在这种情况下,最好使用什么模式

  • 如何使B将消息传输给C

  • 我是否需要自定义事件/委托来向B传输数据,或者我可以使用内置事件

附言:我正在使用C#作为我的编程语言


编辑:感谢大家帮助我,投票即将开始。

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


请注意,这基本上是的一个变体,其中a是模型,C是视图。现在,B是否会成为一个合适的控制器在很大程度上取决于它的职责:如果它只是a的集合,那么让它成为控制器不是一个好主意。如果没有更多关于您的类和职责的详细信息,很难说得更多。

我最后使用了几乎相同的场景来演示被动扩展

RX是观察者模式的一种形式主义,但被推广为迭代器模式的逆/对偶

详细信息和源代码-


(psuedo代码…

在这里,观察者是一种合适的模式。我不明白你为什么这么说:

然后我有一个“收集类”B 它有一个a的列表

因为,对于观察者模式,我认为B应该观察A,所以在类A中,有一些B用于监听A触发的事件(A文件夹被更改)。类似地,C类应该观察B类,所以在B类中有一些对象C寄存器用于监听B发出的事件。
自定义事件或内置事件的必要性取决于您的类。如果它是.NET类,我认为会有一些事件通知目录中的更改。如果没有,您应该编写自己的事件/委托。

我从中了解到,有一组“a”对象异步地将事件传递给单个B,然后将该信息传递给单个C

那么,让B包含并观察A,让C观察B

如果你有很多a,你可能想让B在通知C之前收集/缓存a的事件。特别是当C为用户界面服务时

旁注:不要过度模式化您的软件。试着保持开放的心态,总是找到最简单、最容易的解决方案。只在适当的地方使用模式,而不仅仅是因为它是可能的。我见过很多人在不必要的地方加入代理、命令模式、观察者、MVC、中介等


祝你好运。

我会看一看,thnx!
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... */ };
    }
}