【问题标题】:State pattern with SAX使用 SAX 的状态模式
【发布时间】:2009-05-24 19:42:21
【问题描述】:

我必须用 java SAX 解析器解析一些 xml。趁着忙,看到这里可以使用状态模式。

定义了明确的状态和状态转换,类似于 xml 文档的结构。

要实现状态模式,我必须定义一个接口(或抽象类)。最明显的接口方法是:

public void startElement(String elementName);
public void endElement(String elementName);

但是我遇到的问题是如何返回信息。我需要一个结构中的 xml 文档中多个级别的信息。

这是xml文档的一部分

<chessboard>
     <white>
         <king>
              <position>
                  <x>e</x>
          <y>1</y>
              </position>
         </king>
         <pawns>
             <pawn id="1">
                  <position>
                      <x>e</x>
              <y>2</y>
                  </position>
             </pawn>
             <pawn id="1">
                  <position>
                      <x>f</x>
              <y>2</y>
                  </position>
             </pawn>
         </pawns>
    </white>
</chessboard>

我的假设是否正确,状态模式适合这里?如果是这样,在这里实现它的最佳方法是什么?

【问题讨论】:

  • 不使用状态模式,为什么不直接使用允许随机访问的api呢?

标签: java xml sax state-pattern


【解决方案1】:

您的接口可以由其实例“内部积累”特定所需信息的类实现,并添加其他方法以使该信息可访问。

但是,很难拥有通用的“获取信息”方法,因为类型可能会有所不同;并且,整个方法可能不太适合 SAX 类方法的主要优点,即随着解析的进行逐步执行操作的能力,而不是在解析过程中积累信息并且只在以后采取行动(这个优势在当您正在解析非常大的文档)。因此,我不会将其视为在 Java 中使用 SAX 的“规范”方式,而只是偶尔会派上用场的一种变体。

【讨论】:

  • 你让我思考。我可以将一个类传递给状态类的每个方法,而状态类可以改变那个类。即使使用 SAX 的正常方法,您也必须保留一些状态。
【解决方案2】:

我认为状态模式正好适合这里。必须保留一些状态,才能知道您在文档中的位置。

要收集信息,您可以将一个对象传递给状态类的每个方法,以便它们可以将信息放入其中。

除非有其他我没有想到的问题,否则我认为这是最好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2011-06-23
    • 2013-02-01
    相关资源
    最近更新 更多