Web サービスの URL リクエストをオブジェクトとして表現したいのですが、継承階層で「バブルアップ」できる共通パラメーターがたくさんあることがわかりました。リクエストには、いくつかの必須およびその他のオプションの多くのパラメーターを含めることができます。そのため、流暢なインターフェースで名前付き引数をエミュレートする Bloch の Builder パターンが優れたオプションであると私は信じています。
具体的には、一般的な Web サービス要求として Google マップ Web サービス API を設計しています。
http://maps.googleapis.com/maps/api/service/output?{parameters}
service
とoutput
は必須の引数でありsensor
、必須のパラメーターです。オプションのパラメータもありますlanguage
。
各サービスには、一連の必須パラメータとオプション パラメータがあります。Geocode サービスには、2 つのオプション パラメータがbounds
ありregion
ます。また、サービスのタイプ (それぞれダイレクトまたはリバース ジオコーディング) を指定する、相互に排他的な必須パラメーターaddress
またはもあります。location
私はこの相互排除を新しい子供クラスで表現しています。
クラス階層を次のように想像します。
.-----.
| Url |
'-----'
^
|
.---------.
| Request |
'---------'
^
|----------------------------+--------------...
.---------. .------------.
| Geocode | | Directions |
'---------' '------------'
^ ^
|------------+ .
.--------. .---------. .
| Direct | | Reverse | .
'--------' '---------'
次に、次のようなことをしたいと思います。
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();
挿入先のクラスとスーパークラスの引数とメソッドを使用する Builder を作成するにはどうすればよいですか?