簡體   English   中英

什么是實現網絡協議(XML)的良好設計模式?

[英]What's a good design pattern to implement a network protocol (XML)?

我想實現網絡協議。 為了獲得可維護的設計,我正在尋找合適的圖案。

該協議基於XML,應使用Java讀取。 為了簡化討論,我假設使用示例語法:

<User>
  <GroupList>
    <Group>group1</Group>
    <Group>group2</Group>
  </GroupList>
</User>

簡短的問題:解析這樣的事情的最佳設計模式是什么?

長版:我發現了這個 問題 ,並提出了不同的模式(主要是狀態模式)。

我的實際(但缺少)解決方案是:我為XML中的每個可能的條目創建一個包含數據和解析器的類。 因此,我有UserUser.Parser ,...作為類。 此外,還有一個具有Map<String,AbstractParser>ParserSelector ,在其中注冊了所有可能的子條目。 對於每個解析器,實例化並設置一個ParserSelector 例如, ParserSelector所述的GroupList.Parser具有一個條目:從字符串的映射"Group"到的一個實例Group.Parser 如果不使用ParserSleector類,則必須將此代碼塊寫入每個單獨的解析器中。

現在的問題是如何將讀取的數據獲取到超對象。 Group.Parser將創建一個內容為group1Group對象。 現在必須在GroupList對象中注冊該對象。 我已經閱讀過使用Visitor或Observer模式,但不了解它們在此處的適用范圍。

我在下面提供一些偽代碼來查看問題。 您會看到,我必須通過instanceof檢查類型,因為靜態存在類型信息不可用。

我認為這應該有可能以更簡潔(更易於維護)的方式解決在Java中使用多態的問題。 我總是面臨着這樣的問題,即Java只在覆蓋時才進行動態綁定。 因此,我無法像在訪問者/觀察者一樣的方法中向XMLParser.parse(...)方法添加參數以允許“遠程更新”。

旁注:真正的語法是“深層的”,也就是說,有很多XML條目(這里只有三個: UserGroupListGroup ),而它們中的大多數可能只包含很少的不同子條目( UserGroupList可以此處僅包含一個子條目,而Group本身僅包含文本)。

以下是偽Java代碼的幾行內容來解釋該問題:

class User extends AbstractObject {
    static class Parser implements XMLParser {

        ParserSelector ps = ...; // Initialize with GroupList.Parser

        void parse(XMLStreamReader xsr){
            XMLParser p = ps.getParser(...); // The corresponding parser.
            // We know only that it is XMLParser statically.

            p.parse(...);

            if(p instanceof GroupList.Parser){
                // Set the group list in the User class
            }
        }
    }
}

class GroupList extends AbstractObject{...}
class Group extends AbstractObject{...}

class ParserSelector{
    Map<String,XMLParser> = new Map<>();
    void registerParser(...){...} // Registers a possible parser for subentries

    XMLParser getParser(String elementName){
        return map.get(elementName); // Returns the parser registered with the given name
    }
}

interface XMLParser {
    void parse(XMLStreamReader xsr);
}

abstract class AbstractObject{}

要完成此問題:

我最終選擇了JAXB 實際上,我不知道它允許根據Java源代碼(使用注釋)輕松創建XML Schema。

因此,我只需要使用用於傳輸的經典Java對象編寫代碼。 然后,API可以很好地處理與XML之間的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM