[英]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中的每個可能的條目創建一個包含數據和解析器的類。 因此,我有User
, User.Parser
,...作為類。 此外,還有一個具有Map<String,AbstractParser>
的ParserSelector
,在其中注冊了所有可能的子條目。 對於每個解析器,實例化並設置一個ParserSelector
。 例如, ParserSelector
所述的GroupList.Parser
具有一個條目:從字符串的映射"Group"
到的一個實例Group.Parser
。 如果不使用ParserSleector
類,則必須將此代碼塊寫入每個單獨的解析器中。
現在的問題是如何將讀取的數據獲取到超對象。 Group.Parser
將創建一個內容為group1
的Group
對象。 現在必須在GroupList
對象中注冊該對象。 我已經閱讀過使用Visitor或Observer模式,但不了解它們在此處的適用范圍。
我在下面提供一些偽代碼來查看問題。 您會看到,我必須通過instanceof
檢查類型,因為靜態存在類型信息不可用。
我認為這應該有可能以更簡潔(更易於維護)的方式解決在Java中使用多態的問題。 我總是面臨着這樣的問題,即Java只在覆蓋時才進行動態綁定。 因此,我無法像在訪問者/觀察者一樣的方法中向XMLParser.parse(...)
方法添加參數以允許“遠程更新”。
旁注:真正的語法是“深層的”,也就是說,有很多XML條目(這里只有三個: User
, GroupList
和Group
),而它們中的大多數可能只包含很少的不同子條目( User
和GroupList
可以此處僅包含一個子條目,而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.