首先,这只是概念,我还没有完成实际编程。情况就是这样:
我有一个A类,它使用Filesystemwatcher来监视文件夹中的更改。 (使用事件)
然后我有一个'Collection Class'B,它有一个A的列表。
现在我想要发生的事情如下,
文件夹发生更改,A检测到此消息并向B发送消息,B将此消息传送到C类。然后,C类开始更新GUI的方法。 (做了哪些改变等等。)
现在我已经在这个问题上进行了很长时间的搜索和思考,但找不到解决方案。但是,我发现了两种设计模式:
调解员和观察员。
作为一名软件工程师,我曾在某种程度上制作了Observer模式,因此我了解了一些基础知识。
现在回答我的问题:
在这种情况下最适合使用哪种模式?
如何将B发送给C?
我是否需要自定义事件/代表才能将A传输数据发送给B,或者我可以使用内置事件吗?
P.S。:我正在使用C#作为我的编程语言。
编辑:感谢所有人帮助我,投票正在进行中。
答案 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。如果没有,您应该编写自己的事件/代理。