0

假设我有这个 XML

<doc:document>
  <objects>
    <circle radius="10" doc:colour="red" />
    <circle radius="20" doc:colour="blue" />
  </objects>
</doc:document>

这就是它的解析方式(伪代码):

// class DocumentParser
public Document parse(Element edoc) {
     doc = new Document();
     doc.objects = ObjectsParser.parse(edoc.getChild("objects"));

     for ( ...?... ) {
         doc.objectColours.put(object, colour);
     }

     return doc;
}

ObjectsParser负责解析对象位,但不知道也不应该知道文档的存在。但是,Document颜色通过使用 与对象相关联Map

您会建议使用哪种模式将颜色设置返回给DocumentParser.parsefrom,ObjectsParser.parse以便将其与地图中它们所属的对象相关联?

替代方案是这样的:

<doc:document>
  <objects>
    <circle id="1938" radius="10" />
    <circle id="6398" radius="20" />
  </objects>
  <doc:objectViewSettings>
   <doc:objectViewSetting object="1938" colour="red" />
   <doc:objectViewSetting object="6398" colour="blue" />
  </doc:objectViewSettings>
</doc:document>

丑陋!

4

2 回答 2

0

有什么问题

for (ObjType obj : doc.objects)
{
    doc.objectColours.put(obj, obj.getColour())
}

这假设

  1. ObjectsParser 返回一个实现 Iterable 的集合实例
  2. ObjType 可用作哈希键(正确实现 equals() 和 hashCode())
于 2010-06-16T21:32:27.150 回答
0

这是我自己的一个想法:

interface ObjectCreatedFromXmlCallback {
     created(Object object, Element source);
}

// class DocumentParser
public Document parse(Element edoc) {
     doc = new Document();
     doc.objects = ObjectsParser.parse(edoc.getChild("objects"), new ObjectCreatedFromXmlCallback() {
      created(Object o, Element s) {
       if (o instanceof Circle) {
        // read the colour property from s
        doc.objectColours.put(o, colour);
       }
      }
     });

     return doc;
}

// ObjectsParser.parse
c = new Circle();
c.radius = ecircle.getAttribute(...);
callback.created(c, ecircle);
于 2010-06-16T21:56:19.947 回答