【问题标题】:Design patterns for event-driven logic事件驱动逻辑的设计模式
【发布时间】:2010-10-24 10:42:57
【问题描述】:

我正在开发一个桌面应用程序,它依赖于它从服务器接收的 XML 数据。有几个文件,需要在不同的时间下载。

许多数据结构都填充了解析的数据。文件和数据结构之间的对应关系不是一一对应的,事实上可能比较复杂。

应用程序状态和状态之间的转换取决于这些下载信息的内容(以及它们目前的可用性)。

晦涩的意大利面条代码处理所有下载事件和相互依赖关系。

我一直在研究某种模式以更统一地使用它,但我认为开发人员社区已经找到了最合适的实践和模式。有谁知道吗?

【问题讨论】:

  • 也许有,也许没有。那么,你的问题是什么?
  • 把它留出来,让别人做一个诙谐的评论。实际上似乎已经足够清楚了,但是,好的,将编辑。
  • 我确实不清楚。希望现在能更好地表达问题。

标签: design-patterns events client-server


【解决方案1】:

当你有状态时,你肯定需要状态模式。当您有关于状态转换的复杂规则以及连接到此状态的不同 BL 时,这是最好的方法。首先绘制状态图,然后很容易编写所需的类。

我还必须同意 John 的 Observer 模式,您可以使用它来进行所需的依赖反转,并轻松处理状态转换。

在您的情况下,您可以将所有 BL 放入状态类并在系统遇到该状态时进行处理,您将进行代码分离并且没有意大利面条式代码...代码将跟随并根据状态转换执行 BL。

【讨论】:

  • 状态模式可能被认可,因为它与“状态机”无关。
【解决方案2】:

应用程序状态和转换 状态之间取决于内容 (以及他们目前的可用性) 那些下载的 信息。

看起来您需要使用分层模式。我的意思是在您上面提到的示例中,是在状态模式之上使用策略模式。

【讨论】:

    【解决方案3】:

    我已经广泛使用 Model-View-ViewModel 模式有一段时间了,我强烈推荐它。尽管网络上关于它的大多数文章都将它与 WPF 牢固地联系在一起,但没有理由不将它与其他技术一起使用。我已经将它用于 Web 服务、WPF 客户端和命令行(三个“视图”共享较低层)。

    这是我快速而肮脏的描述: 该模式由三层(自上而下)组成:视图(通常是 GUI,但实际上是任何外部接口)、视图模型(包含业务逻辑和工作数据集)和模型(域对象等)。每个层直接与下面的层通信,并为上面的层触发事件。

    在 .Net 领域,该模式严重依赖 INotifyPropertyChanged 接口。当模型中的数据结构发生变化时,它们可能会触发一个事件。 ViewModel 可以更新其状态(应用程序状态)作为响应并触发其事件。然后视图可以更新以显示新的应用程序状态。

    这是一篇不错的文章: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

    再一次,该文章以 WPF 为中心。

    我希望这个答案适合您。如果没有,有关该问题的更多信息可能会很有用。你不是在谈论信号量、队列和线程吗?

    【讨论】:

    • 我说的更多的是封装下载、解析(以及等待下载)逻辑。
    • 好吧,我会将所有这些都放入模型层并在发生有趣的事情时触发事件以供更高层响应。至于具体的架构,我想是时候给大家拆个UML图了……
    【解决方案4】:

    【讨论】:

    • 你不会带着它去任何地方。我们正在谈论的逻辑将成为控制器类中使用的控制器的一部分。我正在寻找的是微架构解决方案。
    • 您可能希望在您的问题中更具体。不太确定您要解决什么问题。请记住,模式并不总是解决方案。如果你认为你有意大利面条式的代码,那么首先使用基本的 OO 原则重构它。
    【解决方案5】:

    observer pattern 可能是事件驱动系统最著名的设计模式之一。

    【讨论】:

    • 观察者只是一个基本的东西。我在想一些更高级的东西。
    • 也许黑板系统(架构模式)是被认可的。谷歌搜索“架构模式黑板”。您的 XML 文件阅读器可以将他们构建的数据结构放入 Blackboard 中,并向 Blackboard 发送有关他们所做工作的事件。观察者监听/订阅黑板事件并在所有相关事件发生时执行所需的操作(文件完全读取、某些节点构建、bla bla 找到等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2011-11-18
    • 2018-07-13
    • 1970-01-01
    • 2012-08-21
    • 2023-04-05
    • 2018-09-01
    相关资源
    最近更新 更多