事件驱动逻辑的设计模式

4
我正在开发一个桌面应用程序,它依赖于从服务器接收的XML数据。有几个文件需要在不同的时间下载。
一些数据结构会填充解析后的数据。文件和数据结构之间的对应关系并非一一对应,实际上可能相当复杂。
应用程序状态及其状态之间的转换取决于这些已下载信息内容(以及此时的可用性)。
晦涩难懂的代码处理所有下载事件和相互依赖关系。
我已经花了一段时间研究如何以更统一的方式处理它的模式,但认为开发者社区已经找到了最适合的实践和模式。有人知道吗?

3
也许有,也许没有。那么,你的问题是什么? - Bombe
1
把它省略掉,让别人发表一个机智的评论。实际上似乎已经很清楚了,但好吧,我会编辑一下。 - Maleev
1
我之前表达不够清晰,希望现在问题能更好地被表述出来。 - Maleev
5个回答

3
当你有状态时,你一定需要使用状态模式。当你有关于状态转换的复杂规则以及与这些状态相关联的不同业务逻辑时,这是最好的方法。首先绘制状态图,然后编写所需的类就很容易了。
我也同意John提出的观察者模式,你可以使用它来实现所需的依赖反转,并轻松处理状态转换。
在你的情况下,你可以将所有业务逻辑放入状态类中,并在系统达到该状态时进行处理,这样就会有代码分离和无 spaghetti code...代码将根据状态转换遵循并执行业务逻辑。

1
状态模式可能不太适合,因为与其名称不同,它与“状态机”无关。 - Angel O'Sphere

2
我已经长期使用Model-View-ViewModel模式,并且强烈推荐它。虽然网络上大多数与此相关的文章都将其与WPF紧密联系在一起,但是我们也可以将其应用于其他技术领域。我曾将其应用于Web服务、WPF客户端和命令行(三个“视图”共享底层)。
这个模式由三个层次构成(自上而下):视图(通常为GUI,但实际上可以是任何外部接口)、视图模型(包含业务逻辑和工作数据集)和模型(领域对象等)。每个层次直接与下面的层次进行通信,并向上面的层次触发事件。
在.Net中,该模式严重依赖于INotifyPropertyChanged接口。当模型中的数据结构发生更改时,它们可能会触发一个事件。视图模型可以根据响应更新其状态(应用程序状态)并触发其事件。视图随后可以更新以显示新的应用程序状态。
以下是一篇不错的文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。再次提醒,该文章是WPF为中心的。
希望我的回答对您有所帮助。如果没有,请提供更多有关问题的信息。您是否在谈论信号量、队列和线程?

我更多地谈论封装下载、解析(以及等待下载完成)逻辑的问题。 - Maleev
我会把所有这些放到模型层中,并在发生有趣的事情时触发事件,以便更高层次做出响应。至于具体的架构,我认为现在是你拿出UML图表的时候了... - AndrewS

1
应用程序的状态和状态之间的转换取决于已下载信息的内容(以及它们在该时刻的可用性)。
看起来你需要使用分层模式。我的意思是,在你上面提到的例子中,需要使用一个策略模式来覆盖一个状态模式。

0

在事件驱动系统中,可能最出名的设计模式之一就是观察者模式


观察者模式只是基础的东西。我在考虑更高级的东西。 - Maleev
3
也许一个黑板系统(架构模式)是合适的。在谷歌上搜寻“architecture pattern blackboard”。XML文件读取器可以将它们所建立的数据结构放置到黑板中,并向黑板发送事件来说明它们所做的事情。观察者监听/订阅黑板事件,并在所有相关事件发生后执行必要的操作(文件完全读取、某些节点构建、bla bla等)。 - Angel O'Sphere

0

你不需要将其放在任何地方。我们正在讨论的逻辑将成为控制器中使用的控制器类的一部分。我正在寻找的是微架构解决方案。 - Maleev
你可能需要在问题中更具体一些。我不太确定你想要解决什么问题。请记住,模式并不总是解决方案。如果你认为你的代码像意大利面条一样混乱,请首先使用基本的面向对象原则进行重构。 - willcodejavaforfood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接