【问题标题】:java interface design: how to handle stateful processingjava接口设计:如何处理有状态的处理
【发布时间】:2009-03-31 18:13:01
【问题描述】:

我在为我的应用程序的特定部分设计良好的架构时遇到了麻烦,尤其是在涉及维护状态的地方。

我有一组解析操作:

我的班级Reader 将数据块读入缓冲区并处理整个控制流。 我的班级Parser 获取缓冲区中的数据块和ParsedDataHandler,并将其分成更小的块供ParsedDataHandler 管理。

ParsedDataHandler 是我正在尝试设计的界面;我想我想做这样的事情(“BlockInfo”表示一些包含各种状态位的数据结构,其中将包括一个保存整个原始数据块的 ByteBuffer。“ChunkMetadata”表示包括块内每个块的位置的信息,以及Parser 确定的有关该块的任何其他信息)

interface ParsedDataHandler
{
    void beginBlock(BlockInfo bi);
    void handleParsedData(BlockInfo bi, ChunkMetadata m);
    void endBlock(BlockInfo bi);
}

所以Reader 将调用ParsedDataHandler.beginBlock() 让它在块的开头设置任何状态,并承诺离开 BlockInfo 常量的指定部分(可能是全部),直到它对 @ 进行匹配调用987654330@ -- 之后它可能会为下一个块重用数据缓冲区。 Parser 遍历数据块并根据预定义的数据协议将其拆分为块,并将多次调用ParsedDataHandler.handleParsedData(),每个块一次。合约包含一个保持固定的缓冲区的一个原因是,ParsedDataHandler 可以在开始或结束时复制整个数据块,并且当它们在一起时不必将块重新组合成一个块一直都在。

所以有责任分工:

  • Reader 只负责管理整个程序和读取数据,它不会关心其他任何事情。
  • Parser 是将数据块分成块的东西,它并不关心如何处理它们或数据如何到达那里
  • ParsedDataHandler 是我正在尝试设计的接口,以便具体类可以实现它并正常工作,而不需要 ReaderParser 关心它的作用,或者不关心如何将块划分为块或数据的来源。

我的问题是,维护任何状态的负担是否应该由实现ParsedDataHandler 的类承担并远离 BlockInfo?如果我的接口的语义包括 BlockInfo 中的原始数据块在 beginBlock() 和 endBlock() 调用之间不会改变的事实,那么我是否应该只将其传递给 beginBlock() 而不是其他调用?还是为了方便可以发过来?

是否有更好的设计模式来处理这种情况?

【问题讨论】:

    标签: java design-patterns interface


    【解决方案1】:

    首先,您的实现非常接近State Pattern 的经典示例。我看到的唯一问题是 BlockInfo 的作用。

    如果 BlockInfo 在这些步骤之间发生了更改,那么您的实现就是您需要做的。看看我引用的维基百科文章。点在 Mousedown、MouseMove 和 MouseUp 之间发生变化,因此它必须是抽象工具的参数。

    如果 BlockInfo 在步骤之间没有发生变化,那么您需要考虑几件事。

    如果实现 ParsedDataHandler 的类正在初始化 BlockInfo 结构的任何部分,那么我会将其分离出来并使其成为该类的私有成员,并让 BlockInfo 传入解析过程外部的初始化数据。

    如果 BlockInfo 正在被 BeginBlock 修改并传递给后续例程,那么您应该克隆 BlockInfo,将其内部存储在实现 ParsedDataHandler 的类中。然后将其从参数列表中删除。

    如果您之后需要 BlockInfo,我会创建一个返回内部 BlockInfo 的只读属性。

    根据您的问题,我猜您应该将 BlockInfo 传递给 BeginBlock 并将其存储在内部。从其他方法的参数中删除它,然后在需要检索它时添加 readonly 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2013-07-23
      • 2023-04-02
      • 1970-01-01
      • 2021-02-19
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多