2016-09-27 3 views
-1

を持つオブジェクトのビルド:私が構築したい私は、Java 1.6</p> <p>シナリオ使用しています入れ子にentities.Designパターン

<pnr> 
    <outbound> 
     <travellers> 
      <person> 
       <name></name> 
       <address></address> 
      </person> 
      <person> 
       <name></name> 
       <address></address> 
      </person> 
     </travellers> 
     <segments> 
      <segment> 
       <from></from> 
       <to></to> 
       <date></date> 
       <flight-details> 
        <flight-id></flight-id> 
       </flight-details> 
      </segment> 

      <segment> 
       <from></from> 
       <to></to> 
       <date></date> 
       <flight-details> 
        <flight-id></flight-id> 
       </flight-details> 
      </segment> 
     </segments> 
    </outbound> 

    <inbound> 
     ... 
    </inbound> 
</pnr> 

:私はこのようになります「PNR」と呼ばれるエンティティの構造を持っている を上記のXMLのような構造を持つオブジェクト 私はこのようになりますクラス「PNR」の対象で始まる:

class Pnr{ 
    Outbound outbound; 
    Inbound inbound; 
} 

//Outbound 
class Outbound{ 
    ... 
} 

//Inbound 
class Inbound{ 
    ... 
} 

エンティティのネストが次の各エンティティはクラスによって表されます。

ネストされたPnrオブジェクトを作成するためのデザインパターンを提案してください。

私はビルダーパターンを通過しました。 私の場合: 1)コンストラクタに渡すパラメータがあまりにも多くありません。 2)私たちはPnrオブジェクト全体を構築したいと思っています。だから我々は、異なるパラメータリストを持ついくつかのコンストラクタを必要としない。

しかし、私はネストされたエンティティの構築を効果的に処理しなければなりません。 私はまだビルダーパターンと一緒に行くべきですか?

どのデザインパターンがこのようなケースに適しているかお考えください。

ありがとうございました!

+0

私は実際にこの問題を理解していません。なぜ 'Inbound'と' Outbound'オブジェクトを 'Pnr'コンストラクタに渡すことができませんか? –

+1

*「私は次のgoogleを構築する必要があります。どのデザインパターンがその問題を解決してくれますか?」「いいえ、それはそうではありません。デザインパターンはアルゴリズムではなく、プログラムを構成するための推奨事項です。 JAXB BTWを見てみることをお勧めします。 xjdを使用してxsdスキーマからオブジェクト構造を生成することもできます。 – fabian

+0

@JornVernee私はそれを行うことができます。しかし、私は、インバウンドオブジェクトを構築するメソッドを書かなければなりません。次のように:内部でbuildTravellers()を呼び出すbuildInbound()は、buildAddress()を再度呼び出すbuildPerson()を呼び出します。これらのメソッドをすべてヘルパークラスに入れて処理を進めることができます。しかし、より良い方法がありますか? – user3427320

答えて

1

あなたはここで間違っていると思います。シリアライズされたデータのレイアウト(たとえば、XMLファイルに情報を書き込むときなど)は、クラスのデザインには影響しません。

例:XMLには、「インバウンド」と「アウトバウンド」のカテゴリがあります。 オブジェクトモデルに本当に必要ですか?意味:あなたは本当にあなたのクラス構造内の "修正"したいですか?

あなたのオブジェクトモデルのデザインに焦点を当てます。エンティティ、クラスを定義します。より具体的には、オブジェクトの合理的なプロパティを定義します。

そして、十分なモデルを考え出すと、XMLからの書き込み/読み込みの変換について考えることができます。

次のようにします。SAXパーサーを使用している可能性があります。そのパーサが「人」情報に沿って来ると、それは必要な情報を収集し、単一のPersonオブジェクトを作成します。そして、次のレイヤーは、作成された "n" Personオブジェクトを "旅行者"を構成する何らかのコレクションに追加することを決定するかもしれません。しかし、旅行者はクラスである必要はないかもしれません。おそらく単なる簡単なList<Person>です。

短いストーリー:あなたは物事を後方に持っています。 XMLスキーマに基づいてオブジェクトモデルを開発することはありません。それとは反対に!

+0

私はオブジェクトの入れ子構造を持っているという事実を説明するためにXML構造を与えました。私はパーサを使用していません。 – user3427320

+0

私はオブジェクトの入れ子構造を持っているという事実を説明するためにXML構造を与えました。私はパーサを使用していません。私はすでにすべての必要なデータを持っています。ネストされたオブジェクトは、すべての関連するメソッドを1つのクラスに入れることで構築できます。例えば、buildOutbound()は私のoutBoundオブジェクトをビルドします。inturnはpopulateTravellers()メソッドを呼び出します。このメソッドは、旅行者を反復し、in-turn buildTraveller()を呼び出して、buildAddress()などを呼び出します。 1つのクラス自体で作成し、Pnrオブジェクトの構築に進みます。しかし、これを行うためのきれいな方法がありますか? – user3427320

0

デコレータパターンを確認しましたか?あなたのケースでは、非常に多くのエンティティを作成する必要があるかどうかはわかりません。しかし、あなたが言ったようにエンティティをサブクラス化しなければならない場合は、デコレータパターンを使用することができます。

しかし、Person、FlightDetailsなどのエンティティとこれらの要素のリストを持つクラスで理想的にSAXパーサーを使用する必要があります。例えば、http://tutorials.jenkov.com/java-xml/sax-example.htmlを参照してください。

関連する問題