もう 1 つのアプローチは、プル モデルではなくプッシュ モデルを採用することです。通常、カプセル化を破っているため、別のフォーマッターが必要であり、次のようなものがあります。
class TruckXMLFormatter implements VehicleXMLFormatter {
public void format (XMLStream xml, Vehicle vehicle) {
Truck truck = (Truck)vehicle;
xml.beginElement("truck", NS).
attribute("name", truck.getName()).
attribute("cost", truck.getCost()).
endElement();
...
特定のタイプからフォーマッタにデータをプルしている場所。
代わりに、形式に依存しないデータ シンクを作成し、フローを逆にして、特定の型がデータをシンクにプッシュするようにします。
class Truck implements Vehicle {
public DataSink inspect ( DataSink out ) {
if ( out.begin("truck", this) ) {
// begin returns boolean to let the sink ignore this object
// allowing for cyclic graphs.
out.property("name", name).
property("cost", cost).
end(this);
}
return out;
}
...
つまり、データはまだカプセル化されており、タグ付きデータをシンクにフィードしているだけです。次に、XML シンクはデータの特定の部分を無視し、一部を並べ替えて、XML を書き込みます。内部で別のシンク戦略に委任することもできます。ただし、シンクは必ずしも車両の種類を気にする必要はなく、何らかの形式でデータを表現する方法だけを気にする必要があります。インライン文字列ではなくインターンされたグローバル ID を使用すると、計算コストを抑えることができます (ASN.1 またはその他の厳密な形式を記述している場合にのみ重要です)。