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.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>

醜い!

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 に答える