说我有这个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.parse
返回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>
难看!
答案 0 :(得分:0)
有什么问题
for (ObjType obj : doc.objects)
{
doc.objectColours.put(obj, obj.getColour())
}
这假定
答案 1 :(得分: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);