【发布时间】: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是我正在尝试设计的接口,以便具体类可以实现它并正常工作,而不需要Reader或Parser关心它的作用,或者不关心如何将块划分为块或数据的来源。
我的问题是,维护任何状态的负担是否应该由实现ParsedDataHandler 的类承担并远离 BlockInfo?如果我的接口的语义包括 BlockInfo 中的原始数据块在 beginBlock() 和 endBlock() 调用之间不会改变的事实,那么我是否应该只将其传递给 beginBlock() 而不是其他调用?还是为了方便可以发过来?
是否有更好的设计模式来处理这种情况?
【问题讨论】:
标签: java design-patterns interface