62

私は、委任、構成、および集約を互いに区別し、一方を他方の上に使用するのが最善である場合を特定するという継続的な問題に直面しています。

私はJavaOOAnalysis and Designの本を調べましたが、まだ混乱が残っています。主な説明はこれです:

委任:オブジェクトが別のオブジェクトの機能を変更せずにそのまま使用する場合。

構成:私のオブジェクトは他のオブジェクトで構成されており、オブジェクトが破壊された後は存在できなくなります-ガベージコレクション。

集約:私のオブジェクトは、私のオブジェクトが破壊された後でも生きることができる他のオブジェクトで構成されています。

それぞれのケースを示すいくつかの簡単な例と、その背後にある理由を示すことは可能ですか?私のオブジェクトが単に別のオブジェクトへの参照を持っている以外に、これらの例を他にどのように示すことができますか?

4

5 に答える 5

69

委任

public class A {
  private B b = new B();

  public void methodA() {
    b.methodB();
  }
}

A呼び出しのクライアントの場合methodA、クラスは呼び出しを'sにA 委任します。BmethodB

理論的根拠。クラスAは、他の場所に属する動作を公開します。これは、クラスAが1つのクラスから継承する単一継承言語で発生する可能性がありますが、そのクライアントには別のクラスで実装される動作が必要です。さらなる研究

ハイブリッド委任

public class A {
  private B b = new B();

  public void methodA() {
    b.methodB( this );
  }
}

単純な転送を伴う委任と、継承の代わりとして機能する委任の違いは、呼び出し先は、次のように例示される呼び出し元のパラメーターを受け入れる必要があることです。

    b.methodB( this );

理論的根拠。クラスがクラスから継承した場合と同じように、クラスBインスタンスがクラスから利用できる機能を使用できるようにしますが、継承は行いません。さらなる研究ABA

構成

public class A {
  private B b = new B();

  public A() {
  }
}

クラスの特定のインスタンスへの参照がなくなるとA、そのクラスのインスタンスBは破棄されます。

理論的根拠。クラスがモジュール方式で動作と属性を定義できるようにします。さらなる研究

集約

public class A {
  private B b;

  public A( B b ) {
    this.b = b;
  }
}

public class C {
  private B b = new B();

  public C() {
    A a = new A( this.b );
  }
}

クラスの特定のインスタンスへの参照がなくなるとA、そのクラスのインスタンスはB破棄されません。この例では、Aとの両方が破棄されるC前にガベージコレクションされる必要があります。B

理論的根拠。インスタンスがオブジェクトを再利用できるようにします。さらなる研究

参照なしのデモンストレーション

これらの単純なパターンに付けられた名前は、それらの参照関係によって定義されます。

于 2009-09-06T00:11:46.477 に答える
56

3つのケースすべてで、オブジェクトは別のオブジェクトを参照します。違いは、参照されるオブジェクトの動作やライフサイクルにあります。いくつかの例:

  1. 構成:家には1つ以上の部屋があります。部屋は家なしでは存在しないため、部屋の寿命は家によって制御されます。

  2. 集合体:ブロックから建てられたおもちゃの家。分解することはできますが、ブロックは残ります。

  3. 代表団:あなたの上司はあなたに彼にコーヒーを飲むように頼みました、あなたは代わりにあなたのためにそれをインターンにやらせました。委任は一種の関連付けではありません(構成/集約のように)。後者の2つは、StackOverflowで何度も議論されてきました

コメントでは、実装がそれぞれの場合にどのように異なるかを尋ねます。すべての場合で、関連するオブジェクトのメソッドを呼び出すことに注意してください。いずれの場合も、次のようなコードがあるのは事実です。

myRoom.doWork();

myBlock.doWork();

myMinion.doWork();

ただし、違いは、関連するオブジェクトのライフサイクルとカーディナリティにあります。

コンポーネントの場合、部屋は家が作成されたときに作成されます。したがって、Houseのコンストラクターでそれらを作成する場合があります。

アソシエーション(タイヤと車を使用します)の場合、車はコンストラクターにタイヤを追加する可能性がありますが、後でタイヤを削除して変更することもできます。したがって、次のような方法もあります

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

そして、aTyreオブジェクトがファクトリーから来た可能性が非常に高いです-私たちはnewCarのどのメソッドでもそれをしませんでした。

委任の場合、委任を保持するためのメンバー変数さえないかもしれません

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

オブジェクト間の関係は、インターンがコーヒーを取っている間だけ持続します。次に、リソースプールに戻ります。

于 2009-09-05T23:09:33.600 に答える
17

あなたの本は非常によく説明されているので、詳しく説明していくつかの例を示しましょう。

委任:オブジェクトが別のオブジェクトの機能を変更せずにそのまま使用する場合。

クラスは論理的に大きくする必要がある場合があります。しかし、大きなクラスは良いコーディング慣行ではありません。また、クラスの一部の機能は複数の方法で実装できる場合があり、それをいつか変更したい場合があります。


class FeatureHolder {
 void feature() {
  // Big implementation of the feature that you dont want to put in the class Big
 }
}

class Big {
 private FeatureHolder FH = new FeatureHolder();

 void feature() {
  // Delegate to FeatureHolder.
  FH.feature();
 }

 //.. Other features
}

上記の例から、Big.feature()はFHの機能を変更せずにそのまま呼び出します。このように、クラスBigには、機能の実装(作業の分離)を含める必要はありません。また、feature()は、「NewFeatureHolder」などの他のクラスによって異なる方法で実装でき、Bigは代わりに新しい機能ホルダーを使用することを選択できます。

構成:私のオブジェクトは他のオブジェクトで構成されており、オブジェクトが破棄された後は存在できなくなります-ガベージコレクション。

集約:私のオブジェクトは、私のオブジェクトが破壊された後でも生きることができる他のオブジェクトで構成されています。

技術的には、コンポジションは「一部」であり、アグリゲーションは「参照」関係です。あなたの腕はあなたの一部です。あなたがもう生きていない場合、あなたの腕も死にます。あなたの布はあなたの一部ではありませんが、あなたはそれらを持っています。ゲストができるように、あなたの布はあなたと一緒に行きません。

プログラミングでは、一部のオブジェクトは別のオブジェクトの一部であり、それなしでは論理的な意味はありません。たとえば、ボタンはウィンドウフレームに構成されます。フレームが閉じている場合、ボタンはもう周りにある理由はありません(構成)。ボタンにはデータベースへの参照がある場合があります(データの再フラッシュなど)。ボタンが削除されても、データベースはまだ存在している可能性があります(集約)。

私の英語で申し訳ありませんが、これがお役に立てば幸いです

于 2009-09-05T23:44:08.820 に答える
1

1)委任:人-運転手-車の例。男が車を買った。しかし、その男は車を運転することを知りません。そこで彼は車の運転を知っているドライバーを任命します。そのため、Manクラスは車を使用して輸送を実行したいと考えています。しかし、それは車との相互作用機能/互換性を持っていません。そこで彼は、manクラスと互換性のあるドライバーであるcarと互換性のあるクラスを使用しています。ドライバーが人間の言うことを理解できると仮定する

2)構成:車のシミュレーションは日常的な例です。車を動かすには、ホイールが回転します。ホイールクラスを使用する車のクラスは、移動機能の一部として機能を回転させますが、ホイールは車の一部です。

3)集合体:車とその色。車のクラスオブジェクトフェラーリは、カラークラスオブジェクトが赤になります。ただし、ユーザー検索が赤色の指定で行われる場合、カラークラスオブジェクトの赤色は個別のクラスとして存在する可能性があります。

于 2013-12-24T13:16:36.607 に答える
0

非常に簡単な文章で私は言うことができます:

委任とは、動作を変更したくない場合に、動作を他のクラスに委任することです。変更とは、実行時を意味します。たとえば、運転中にドライバーが変更されない車のクラスにドライバーを委任します。

構成は次のとおりです。実行時に変更される可能性のあるクラスのファミリー(インターフェースを実装する1つ以上のクラス)の動作を使用する場合。ただし、これらのクラスは、ホテルの部屋などのメインクラスなしでは存在できないことを考慮する必要があります。ホテルを削除すると、ホテルのすべての部屋が存在しなくなります。

集約は次のとおりです。構成と同じですが、クラスはメインクラスなしで存在できます。

于 2020-03-30T11:41:45.070 に答える