2

我们有一个由不同类型的节点组成的树结构,我的任务是编写一些将树导出为某种 XML 格式的代码。

每个节点都从某个基本节点继承,因此它们可以继承基本导出方法,但是对于几种类型的节点,我需要编写自定义导出方法,因为它们的数据以“有趣”的方式存储。

这些节点目前只包含数据和一些与树管理相关的方法。我觉得避免向节点本身添加导出方法是更好的设计,因为这意味着节点正在处理多个职责(管理其父/子,导出)

导出过程基本上从根节点开始并递归调用export,所以理想情况下我可以只实现一个export方法

我正在寻找一种方法(可能是一种设计模式),它允许我在一个单独的类中编写所有导出代码,同时利用节点具有一些继承层次结构的事实。

如果有什么不同,这将用java编写。

4

1 回答 1

1

在这种情况下,您有两个选择,

  • 在基类上实现一个Export虚方法,可以根据需要在派生类上重写,或者
  • 按照评论中的建议,使用访客模式。

从我的角度来看,在基类上实现一个虚拟方法可能是最快的方法,没有重大设计缺陷的暗示。但是,从长远来看,该Export方法的实现可能会发生巨大变化:假设您需要将节点导出为 JSON 对象,或者在给定一组条件的情况下,导出需要同时是 XML 和 JSON,或者只是一个 POCO,或者打印它们到 FileStream。

在这一点上,将导出代码驻留在类本身之外的优势更加明显,因为该Export方法可以快速增长以处理这些多种情况。节点类可以不知道访问者是什么(可能是XmlVisitoror JsonVisitor)以及它的作用,因此添加或修改导出过程意味着对域对象根本没有任何更改。他们只需要获取一个IVisitor知道如何处理它们的对象。

于 2013-06-06T19:31:20.413 回答