我想实现网络协议。为了获得可维护的设计,我正在寻找适合的模式。
协议基于XML,应该用java读取。为了简化讨论,我假设示例语法:
<User>
<GroupList>
<Group>group1</Group>
<Group>group2</Group>
</GroupList>
</User>
简短问题: 解析这样的东西有什么好的设计模式?
长版: 我发现this和this question提出了不同的模式(主要是状态模式)。
我的实际(但缺乏)解决方案如下:
我为XML中的每个可能条目创建一个包含数据和解析器的类。因此,我有User
,User.Parser
,...作为类。
此外,还有ParserSelector
个Map<String,AbstractParser>
,其中所有可能的子条目都已注册。
对于每个解析器,ParserSelector
被实例化并设置。
例如,ParserSelector
的{{1}}有一个条目:从字符串GroupList.Parser
到"Group"
的实例的映射。
如果我没有使用Group.Parser
类,我必须将这个代码块写入每个解析器。
现在的问题是如何将读取数据传递给超级项目。
ParserSleector
会创建一个内容为Group.Parser
的{{1}}对象。
此对象现在必须在Group
对象中注册。
我已阅读过使用访问者或观察者模式,但不了解它们如何适合这里。
我在下面给出一些伪代码来查看问题。
你看,我必须通过group1
检查该类型的静态类型信息是不可用的。
我认为应该可以用更清洁(更易于维护)的方式在java中使用多态来解决这个问题。
我总是面对java只对覆盖进行动态绑定的问题。
因此,我无法在GroupList
方法中添加参数以允许&#34;远程更新&#34;就像访客/观察者一样。
旁注:真正的语法是&#34;深&#34;也就是说,有很多XML条目(这里只有三个:instanceof
,XMLParser.parse(...)
和User
),而大多数条目可能只包含很少的不同子条目({{ 1}}和GroupList
此处只能包含一个子条目,而Group
本身只包含文字。)
这里有一些pseude java代码来解释这个问题:
User
答案 0 :(得分:0)
完成这个问题:
我最终得到了JAXB
。事实上,我不知道它允许从java源代码(使用注释)轻松创建XML Schema。
因此,我只需要使用用于传输的经典java对象编写代码。然后,API很好地处理与XML的转换。