16 Stimmen

Builder-Muster mit Vererbung

Ich möchte eine Webdienst-URL-Anforderung als Objekt darstellen und habe festgestellt, dass es viele allgemeine Parameter gibt, die in einer Vererbungshierarchie "aufgetürmt" werden könnten. Eine Anfrage könnte viele Parameter haben, einige obligatorisch und andere optional, für die ich Blochs Builder-Muster für eine gute Option halte, die benannte Argumente mit einer fließenden Schnittstelle emuliert.

Insbesondere bin ich für die Google Maps Web-Service-API, die als allgemeine Web-Service-Anfrage hat entwerfen

http://maps.googleapis.com/maps/api/service/output?{parameters}

service y output sind obligatorische Argumente, und sensor ein obligatorischer Parameter. Außerdem gibt es einen optionalen Parameter language .

Jeder Dienst hat eine Reihe von obligatorischen und optionalen Parametern. Der Geocode-Dienst hat zwei optionale Parameter, bounds y region . Es hat auch sich gegenseitig ausschließende obligatorische Parameter, address o location die die Art des Dienstes (direkte bzw. umgekehrte Geokodierung) angeben. Ich stelle diesen gegenseitigen Ausschluss mit neuen Kinderklassen dar.

Ich stelle mir die Klassenhierarchie folgendermaßen vor:

  .-----.
  | Url |
  '-----'
     ^
     |
.---------.
| Request |
'---------'
     ^
     |----------------------------+--------------...
.---------.                 .------------.
| Geocode |                 | Directions |
'---------'                 '------------'
     ^                            ^
     |------------+               .
 .--------.  .---------.          .
 | Direct |  | Reverse |          .
 '--------'  '---------'

Dann würde ich gerne etwas wie das Folgende tun:

String output = "xml";
boolean sensor = true;
String address = "Av. Paulista, São Paulo, Brasil";
Bounds bounds  = new Bounds(-20, -10, -25, -20); //Geographic rectangle
String region  = "br";
String lang    = "pt-BR";
Coord location = new Coord(-12,-22);

DirectGeocodeRequestUrl direct = 
    new DirectGeocodeRequestUrl.Builder(output, sensor, address)
                               .bounds(bounds)
                               .language(lang)
                               .build();

ReverseGeocodeRequestUrl reverse = 
    new ReverseGeocodeRequestUrl.Builder(output, sensor, location)
                                .language(lang)
                                .region(region)
                                .build();

Wie kann ich einen Builder erstellen, der Argumente und Methoden aus der Klasse und den Oberklassen verwendet, in die er eingefügt wird?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X