2012-02-27 5 views
3

小さな例から始めます:実行時にJavaで既存のデータ構造を強化するためのデザインパターン

2つのエンティティを持つアプリケーションを想像してみてください。

エンティティA -1 --- N-> EntityB -1 --- N-> EntityC

のは、我々はEnityCインスタンスのリストを返すサービスメソッドがあるとしましょう。 UIでは、EntityCを表示するだけでなく、UIに関連する追加情報(おそらくCSSクラスなど)をエンティティに追加する必要があります。これを解決する一般的な方法は、追加情報をも運ぶことができるラッパーarround EntityCを作成することです。

public class EntityCWrapper implements EntityC, AdditionalInfo { ...} 

または多分、単純なデータ構造として転送オブジェクトを使用します。

public EntityTO { 
    public EntityC entity; 
    public AdditionalInfo info; 
} 

しかし、どのようなサービスはEnitityAインスタンスのリストを返し、我々は(インスタンスグラフ内のすべてのエンティティにAdditionalInfoを添付する必要がある場合EntityBとEntityCの参照されたエンティティインスタンスを含む)?

このような状況に適したデザインパターンを誰かが持っていると思いますか?

+0

「EntityA -1 --- n-> EntityB -1 --- n-> EntityC」とは何ですか? – Kashyap

+0

オブジェクトグラフの単なる例ですが、sthである可能性があります。のような:カテゴリhasmanyアイテムhasmany ItemDetails – sprehn

+1

btw。最初のアイデアは、[Decorator](http://en.wikipedia.org/wiki/Decorator_pattern)パターンを使用して素早く実装できます。 – sprehn

答えて

1

Role Object Patternをご覧ください。

オブジェクトをさまざまなもの(「ロール」と呼ばれる)でどのように拡張できるかを説明しています。 パターンはBussiness Logicを追加する方法に関するものです(これが役割と呼ばれる理由です)が、アイデアが役立つかもしれません。

+0

これは良いヒントでした。この場合、グラフ内のクラスは、ビヘイビアを追加、削除、および照会できるようなインタフェースで準備する必要があります。私はそれがあまりにも邪魔ではないと思う。 (訪問者パターンを実装するのに必要な準備によく似ています)。この追加の情報のために、コアオブジェクトへの委譲は必要ではない。 – sprehn

+0

この非常に事は[拡張オブジェクトパターン](http://www.lcs.syr.edu/faculty/fawcett/handouts/cse776/PatternPDFs/ExtensionObject.pdf)と呼ばれます:-) – sprehn

+0

あなたは正しいです、拡張子オブジェクトパターンは私が探していた2番目のパターンでしたが、その名前は忘れました。 – Ralph

0

AdditionalInfo仮定は、インスタンス固有の(すなわちEntityCの各インスタンスは、AdditionalInfoインスタンスに固有の121の関係を有する)最良のオプションは、メンバー/ ...、任意で充填されるように、その内部AdditionalInfoを含むようにEntityC定義を強化することであろうあなたによって

EntityCを制御できない場合は、2つのオプションの間にTransferObjectが優れているようです。そのように新しいオブジェクト(EntityC)を作成する必要はありません。だからあなたのデータモデルは、基本的に1からnまでの例として、次のオブジェクトを使用している

+0

私はこのようにエンティティが強化されたソリューションを見てきました(おそらく最も簡単な方法です)。しかし、場合によっては、レイヤアーキテクチャを壊すことは適切ではありません。ですから、私の質問は、そうした場合に他に何ができるのかです。 – sprehn

+0

多分辞書(地図)が働くかもしれません... – sprehn

0

(それがされるように工夫)

class Thing 
{ 
    Collection<DooDad> dooDads; 
}  

class DooDad 
{ 
    Collection<DooDadDetail> details; 
} 

class DooDadDetail 
{ 
    ... 
} 

だから私は、n層アーキテクチャの観点から、私のモデルとしてこれを扱っていましたしたがって、これは正確に自分のデータベースにマップする必要があります。何が起きるかは、あなたのモデルが何かをしたいと思っていることです。したがって、ビジネスロジックや外部サービスとやりとりすることができるオブジェクトで構成されるオブジェクトを作成する必要があります。この場合、転送オブジェクトを作成することは、モデルが有効であり、あなたと外部のサービスの間のインターフェイスがモデルに依存しないことを保証するので正しいでしょう。ファサードパターンとデータ転送オブジェクトの一種です。

関連する問題