2012-01-08 24 views
1

複合パターンを含むコードを記述していますが、いくつかの説明が必要です。私はスーパーマネージャー、メインマネージャーと通常マネージャーを持っており、彼らはトップマネージャーと降順階層にあります。複合パターンの実装

私は、スーパーマネージャーがメインマネージャーにいくつかのお金を与え、メインマネージャーが通常マネージャーにお金を与えることができるようにしたいと思います。私が持っている問題は、メインマネージャーがスーパーマネージャーにいくつかのお金を与えることを望んでいないことと、instanceofを使用したくないということです。コンポジットパターンの目的を破るからです。

メインマネージャーと通常マネージャーは、gradeManagersという抽象クラスを拡張していますが、スーパーマネージャーには、gradeManagersタイプのコンポーネントを追加できる配列リストがあります。

答えて

5

階層のように聞こえないのは、コンポジットパターンに最適です。コンポジットパターンは、個々のオブジェクトと同じ方法でオブジェクトのコレクションを処理できるようにするためのものです。 (サブアセンブリは、一緒にボルト締めされていると考えてください。サブアセンブリを他の部品/サブアセンブリと一緒にボルト止めできる単一の部品と考えることもあります。しようとすると、別のManagerとして扱いたいManagerオブジェクトのコレクションがありません。あなたはこのためにコンポジットを使用するかどうかにもかかわらず

、私はあなたが階層を下るにつれて増加するという(のはdepthそれを呼びましょう)プロパティを追加することをお勧めします。これを使用してビジネスルールを実装することができます。マネージャは、同等以上の深度の別のマネージャにのみ金銭を与えることができます。これにより、オブジェクトクラスの概念を避ける方法でコーディングすることができます。

+0

私は悪いコーディングスタイルをシグナリングすることができるinstanceof'私のコード –

+0

@Jackwelch '中のインスタンスを含めることが好きではないが、それを避けるためにフープを介してジャンプすることは良くないでしょうので、ありがとうございます。いずれかを行う必要がある場合は、他の場所で行う必要があるリファクタリングがあるかもしれません。 – kba

+0

+1良い回答@Ted – Nilesh

1

すでにTed Hoppに言及されているように、これはコンポジットパターンを使用する場所のようなものではありません。これはちょうどpolymorphismのように聞こえます。

複合パターンは、アイテムのグループを1つとして扱う場合に使用します。三角形、四角形など、画面に図形を配置できる描画プログラムを考えてみましょう。図形の背景色を変更できる機能を考えてみましょう。あなたが複数の図形の背景色を変更したい場合は、あなたがこの

interface Shape { 
    public void setBackgroundColor(Color c); 
} 

好きで、あなたの実際の実装コードで何かをしたいと思います:

for (Shape s : selectedShapes) 
    s.setBackgroundColor(c); 

を代わりにコードでこれを行うので、複合パターンを使用することができます。これはあなたの実装コードを編集したい「形状」は実際には複数形であるという事実に完全に気づかされることを可能にし、他の任意の形状としてそれを治療するためのアプリケーションを許可します。

class CompositeShape implements Shape 
{ 
    public void setBackgroundColor(Color c); 
    for (Shape s : Shapes) 
     s.setBackgroundColor(c); 
} 

class TriangleShape implements Shape { ... } 
class SquareShape implements Shape { ... } 
0

@Ted Hoppの答え​​を拡張し、深度の代わりにグレードを使用することを提案します。これはあなたが働いているドメインに近いかもしれません。グレーディングマネージャーを持っていることを既に指摘しているので、これは優雅な解決策かもしれません。

希望に役立ちます。

関連する問題