C# 设计模式:选择哪一种?
首先,这只是一个概念,我还没有真正的编程完成。情况就是这样: 我有一个类,它使用Filesystemwatcher监视文件夹中的更改。(使用事件) 然后我有一个“收集类”B,它有一个a的列表 现在我想做的是 文件夹发生更改,A检测到此情况并向B发送消息,B将此消息传输到C类。C类随后开始更新GUI的方法。(进行了哪些更改等) 现在我已经在这个问题上搜索和思考了很长时间,但找不到解决方案。但是,我发现了两种设计模式: 调解人和观察员 作为一名软件工程师,我在某种程度上曾经制作过观察者模式,因此我了解其中的一些基础知识 现在回答我的问题:C# 设计模式:选择哪一种?,c#,.net,design-patterns,C#,.net,Design Patterns,首先,这只是一个概念,我还没有真正的编程完成。情况就是这样: 我有一个类,它使用Filesystemwatcher监视文件夹中的更改。(使用事件) 然后我有一个“收集类”B,它有一个a的列表 现在我想做的是 文件夹发生更改,A检测到此情况并向B发送消息,B将此消息传输到C类。C类随后开始更新GUI的方法。(进行了哪些更改等) 现在我已经在这个问题上搜索和思考了很长时间,但找不到解决方案。但是,我发现了两种设计模式: 调解人和观察员 作为一名软件工程师,我在某种程度上曾经制作过观察者模式,因此我了
- 在这种情况下,最好使用什么模式
- 如何使B将消息传输给C
- 我是否需要自定义事件/委托来向B传输数据,或者我可以使用内置事件
编辑:感谢大家帮助我,投票即将开始。观察员很好。您可以使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... */ };
}
}