Cách tiếp cận khác là áp dụng mô hình đẩy thay vì mô hình kéo. Thông thường, bạn cần các trình định dạng khác nhau vì bạn đang phá vỡ đóng gói và có một cái gì đó như:
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();
...
nơi bạn đang lấy dữ liệu từ loại cụ thể vào trình định dạng.
Thay vào đó, tạo ra một bồn rửa dữ liệu định dạng-agnostic và đảo ngược dòng chảy để loại cụ thể đẩy dữ liệu vào bồn rửa chén
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;
}
...
Điều đó có nghĩa bạn vẫn bị các dữ liệu đóng gói, và bạn chỉ cần cho ăn đã gắn thẻ dữ liệu vào bồn rửa chén. Sau đó, một bồn rửa XML có thể bỏ qua các phần nhất định của dữ liệu, có thể sắp xếp lại một số phần của nó và viết XML. Nó thậm chí có thể ủy thác cho chiến lược chìm khác nhau trong nội bộ. Nhưng bồn rửa không nhất thiết phải quan tâm đến loại xe, chỉ cách trình bày dữ liệu ở một số định dạng. Việc sử dụng các ID toàn cục thay vì các chuỗi nội tuyến giúp giữ cho chi phí tính toán giảm xuống (chỉ có vấn đề nếu bạn đang viết ASN.1 hoặc các định dạng chặt chẽ khác).
Nguồn
2009-03-30 09:28:08
Nó có thể là tốt hơn để đổi tên IVehicleFormatterVisitor chỉ IVehicleVisitor, vì nó là một cơ chế chung nhiều hơn chỉ là để định dạng. – Richard
bạn hoàn toàn đúng. –
Giải pháp apt. +1 –