2012-01-31 8 views
0

基本的に他のコンポーネントで作られた旅程オブジェクトを作成する必要があります。この複雑なオブジェクトを構築するためのデザインパターン

これらのコンポーネントは、特定の順序で追加する必要があります。ものが順不同で追加されたときに、例外/エラーをスローする必要があることを確認する必要があります。

クイックウォークスルー:空港と航空会社がオブジェクト型です

Itinerary Build-itinerary(): 

- AddSegment() 
- AddBaggagePolicy() 
- AddMisc() 

Segment AddSegment(...) 

- add departure airport 
- add arrival airport 
- add departure time 
- add arrival time 
- add duration (total duration) 
- add airline 

セグメントが完成したら、出発点を最終到着先にするためにセグメントを統合する必要があります(1つのポイントから他のポイントまで複数のホップポイントが存在する可能性があるため)。

私はこの旅程をどのようなパターンで作成できますか?

+0

これは設計上の問題のため閉鎖されていますか? – brainydexter

+0

あなたの建物ではありません旅程..オブジェクトを作成し、depart()、arrive()などのように多くの呼び出しを追加しました。それらの間のシーケンスは重要ではありません。 – Jayan

答えて

4

具体的ではないようです。一見すると、私はこれを「建築者のパターン」として特徴付けることができます。 Javaの多くのデザインパターン(ただしすべてではありません)は、言語機能が不足しているための回避策です。

実際、あなたのデザインにはコードの匂いがあります。オブジェクトを構築するためには、明らかに任意の順序で並べられた一連のステップを持つべきではありません。代わりに、データを定義し、それをオブジェクトに渡します。

このようにオブジェクトを構築する必要がある場合は、これを行うコードは、モックの記録スタイルと再生スタイルをサポートするモックを使用して単体テストであることを確認します。 (いわゆる「厳格なモック」。

+0

洞察をお寄せいただきありがとうございます。コードの臭いを少し熟考し、代わりにデータを定義し、それをオブジェクトに渡すことができますか? – brainydexter

+0

@brainydexter:私は何かを好むでしょう.addSegment(departureAirport、depatureTime、arrivalAirport、arrivalTime、duration、airline) 。これは、呼び出し側がそれについて考える必要がないように実装の詳細を抽象化します。 – Arafangion

+0

これは意味がありますか? http:// pastebin。com/YzYMTBg3(これらの名前とパラメータはaddXXX(...)でハードコーディングされていますが、それは渡されたデータを経由します。 – brainydexter

2

そして私は全くデザインパターンにうまくいかない:私はBuilderパターンから始め、各コンポーネントが追加されているかどうかを検証しようとします。少なくともこれは私の出発点になります:ビルダーまたは私的静的内部クラス。

2

は、Builderパターンを使用してみてください。また、あなたは、生成に関するパターンカテゴリの他の変異体を探すことができます。

あなたはパターンを設計する新しいしている場合は、「見てみましょうヘッドファーストデザインパターン」 - そのグーグルブックで(私は...しかし、完全またはプレビュー場合は知らない)

が持って楽しい:)

1

私は言葉聞くと 『建物』と 『注文』、最初のデザインを心に浮かぶパターンはBuilderです。 Design Patternsを初めてお使いの方は、「Applied Java Patterns」を読むことをお勧めします。

0

@Arafangionには同意できませんが、プロシージャ呼び出しの順序が必要な場合があります。ファクトリーメソッドのデザインパターンを調べることをお勧めします。Head First Design Patternsの素敵な例がピザのものを準備するときに覚えています:)

+0

私は時には必要であることに同意しますが、この場合には必要であると主張することはほとんどなく、必要であってもそれが理想的であると主張することはほとんどありません。 – Arafangion