首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对迭代器模式的抽象?

对迭代器模式的抽象?
EN

Software Engineering用户
提问于 2016-02-24 16:10:51
回答 1查看 213关注 0票数 3

最近,我的任务是实现一个研究项目,在那里我必须读取一个XML文件。XML文件包含一个消息列表,我必须将这些消息发送到特定端口上的其他系统。每个消息都有一个可以接收/发送的类型。接收意味着我必须从某个端口接收一条消息,而发送意味着我必须发送一条消息。xml表示我必须发送/接收的消息。这样的XML示例如下所示

代码语言:javascript
复制
<Messages>
  <Message name="A" xml="A.xml" port="PortA" type="receive" time="0" />
  <Message name="B" xml="B.xml" port="PortA" type="transmit" time="11" />
  <Message name="C" xml="C.xml" port="PortB" type="receive" time="0" />
  <Message name="D" xml="D.xml" port="PortB" type="transmit" time="0" />
</Messages>

为了处理这个问题,我使用迭代器模式和简单的方法,如getNextMessage()、hasNextMessage()和loadFile()。如果我更改了消息处理类(MessageHandler)中的某些内容,则这个抽象得到了很好的效果,其他类也不会受到影响。

随着需求的不断增加,我不得不向我的MessageHandler类添加更多的方法来处理复杂的场景。所以,我又增加了几个方法

getNextMessageWithoutIterator() -默认情况下,getNextMessage()在内部递增一个指针,该指针总是指向正在处理的当前消息。但是出现了一个需求,它要求我提前了解1条消息(如果我正在处理消息A,那么这个需求也需要下一条消息B的知识)。因此,这个方法给出了下一条消息,但不增加指针/迭代器。

incrementToNextReceive() --因为这是一个在多个系统之间进行通信的应用程序,因此有时收到的消息比预期的要早。所以,我的处理顺序被扰乱了。为了处理这个问题,我添加了这个方法,它在内部创建另一个指针。此指针被设置为无序消息。所以,当我的正常流到达这个指针时,它会忽略这条消息,因为我们已经收到并处理了它。

再来几个。你会有这样的想法,从一个简单的类开始,现在已经发展成了一个大类,试图为所有可能的场景提供便利。现在,我们最近决定XML文件的当前结构是不够的,因此我们转向了一个更复杂的结构。这个示例结构或多或少地代表了旧结构中的内容。Transition =接收类型消息,而Send是发送类型消息。

代码语言:javascript
复制
<Sequence>
    <Transition stateName="S0" port="portA" match="A.xml" nextState="S1">
        <Send message="B.xml" port="portA" timeDelta="0" />
    </Transition>
    <Transition stateName="S1" port="portB" match="C.xml" nextState="S2">
        <Send message="D.xml" port="portB" timeDelta="1" />
    </Transition>
</Sequence>

现在,我们希望支持这两种类型的XML文件。在这两个XML文件中,我们访问消息的方式是非常不同的。旧的结构是顺序的,我们从消息A开始,一直到消息Z。但是在新的结构中,代码流将进入满足所有需求的任何转换。

问题:在我的代码中,我在不同的位置使用MessageHandler,比如ProcessMessages。现在,由于添加的需求越来越多,MessageHandlar变得不那么抽象,其他类开始依赖并了解创建依赖关系的MessageHandler的内部工作。所以,

怎样才能解决我目前的问题。我是否应该坚持Iterator模式,并以某种方式在其上创建一个抽象。类似于GenericHanlder (接口),然后实现两个迭代器OldMessageHanlder和NewMessageHandler?但是,我为处理额外需求而实现的新方法又如何呢?因为这些方法不会是NewMessageHandler的一部分,也不会以其他方式处理。

我应该在ProcessMessages上添加一个抽象,如GenericProcessMessages,并使用OldProcessMessages和NewProcessMessages实现接口,OldProcessMessage将使用OldMessageHandler,NewProcessMessages将使用NewMessageHandler来处理消息?

我仍然是一个学生,这是我的学习经验,同时提高软件的质量。所以,任何帮助都是很好的。

EN

回答 1

Software Engineering用户

发布于 2016-02-24 16:48:20

排序问题可以用一个排序队列来解决。只需缓冲足够的记录,使无序记录进入队列,并按照适当的顺序排掉下一个记录的队列。对于复杂的结构,您需要一个足够大的缓冲区来容纳所有有效的转换点。

getNextMessageWithoutIterator()只是一个Peek()函数,在迭代器场景中非常常见。Peek()允许您在不推进指针的情况下查看下一条记录。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/310994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档