Ich möchte eine Web-Service-URL-Anfrage als ein Objekt darstellen, und festgestellt, dass es viele allgemeine Parameter gibt, die in einer Vererbungshierarchie "aufgebläht" werden könnten. Eine Anfrage könnte viele Parameter enthalten, einige obligatorisch und andere optional, für die ich Blochs Builder-Muster als eine nette Option empfinde, die benannte Argumente mit einer fließenden Oberfläche emuliert.Builder-Muster mit Vererbung
Insbesondere ist ich die Gestaltung für den Google Maps Web-Service-API, die als allgemeines Web-Service-Anfrage hat
http://maps.googleapis.com/maps/api/service/output?{parameters}
service
und output
obligatorische Argumente sind, und sensor
die obligatorischen Parameter. Es gibt auch einen optionalen Parameter language
.
Für jeden Dienst gibt es obligatorische und optionale Parameter. Der Geocode-Dienst verfügt über zwei optionale Parameter: bounds
und region
. Es hat auch gegenseitig obligatorische Parameter, address
oder location
, die die Art des Dienstes (direkte oder umgekehrte Geokodierung, jeweils angeben). Ich vertrete diesen gegenseitigen Ausschluss mit neuen Kinderklassen.
Ich stelle mir die Klassenhierarchie als solche:
.-----.
| Url |
'-----'
^
|
.---------.
| Request |
'---------'
^
|----------------------------+--------------...
.---------. .------------.
| Geocode | | Directions |
'---------' '------------'
^ ^
|------------+ .
.--------. .---------. .
| Direct | | Reverse | .
'--------' '---------'
Dann würde Ich mag so etwas wie das tun folgendes:
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, die Argumente und Methoden verwendet von die Klasse und Oberklassen, in denen es eingefügt wird?
Die überschriebene Implementierung von 'getThis()' in den konkreten Klassen sollte nicht abstrakt sein. – Eric
@EricTobias Du hast Recht, eine Gefahr von Copy-Paste. Fest. –
Das ist erstaunlich! Genau das, was ich gesucht habe! – Maddy