12

Bridge デザイン パターンと Decorator パターンを詳しく説明してくれる人はいますか。ある意味似ていると思いました。見分け方がわからない?

私の理解では、Bridge では、実装をインターフェイスから分離します。通常、適用できる実装は 1 つだけです。デコレーターはラッパーのようなもので、いくつでもラップできます。

例えば、

ブリッジパターン

class Cellphone {
private:
Impl* m_OS;         // a cellphone can have different OS

}

デコレータ パターン

class Shirt {
private:
Person * m_p;           //put a shirt on the person;

}
4

4 に答える 4

20

デコレーターは、装飾するオブジェクトのインターフェースと一致する必要があります。つまり、同じメソッドを持ち、途中で引数をインターセプトし、途中で結果をインターセプトできます。これを使用して、同じインターフェイス/コントラクトを維持しながら、装飾されたオブジェクトに追加の動作を提供できます。Decorator のインターフェースは、より便利なオブジェクトを作成するための追加機能を提供できることに注意してください。

Bridge にはそのような制約はありません。クライアント向けのインターフェースは、実装を提供する基礎となるコンポーネントとは異なる場合があるため、クライアントのインターフェースと実際の実装 (クライアントに優しくない、変更される可能性があるなど) の間を橋渡しします。

于 2010-02-12T19:31:31.387 に答える
6

デコレータ パターンの実装が正しくありません。

class PersonWearingShirt : IPerson
{
private:
    IPerson * m_p;           //put a shirt on the person;

}

クラスをデコレートすると、まったく同じインターフェイスが公開されるという考え方です。これにより、「装飾された」インスタンスの外観と動作が元のようになります。これにより、インスタンスを複数のデコレータで何度もラップできますが、元のインスタンスを扱うのとまったく同じように扱うことができます。

于 2010-02-12T19:35:32.523 に答える
5

デコレータ:

  1. 実行時にオブジェクトに動作を追加します。継承は、この機能を実現するための鍵であり、これはこのパターンの長所と短所の両方です。
  2. インターフェイスの動作を強化します。
  3. Decorator は、コンポーネントが 1 つだけの縮退した Composite と見なすことができます。ただし、Decorator は追加の責任を追加します。これは、オブジェクトの集約を目的としたものではありません。
  4. デコレーターは再帰的構成をサポートします
  5. Decorator クラスは、LCD (Lowest Class Denominator) インターフェイスとの合成関係を宣言し、このデータ メンバーはそのコンストラクターで初期化されます。
  6. Decorator は、サブクラス化せずにオブジェクトに責任を追加できるように設計されています

詳細については、ソース作成の記事を参照しください。

ウィキペディアのDecoratorのUML図:

ここに画像の説明を入力

ブリッジパターン:

  1. ブリッジは構造パターン
  2. 抽象化と実装はコンパイル時にバインドされません
  3. 抽象化と実装 - どちらもクライアントに影響を与えずに変更できます

次の場合に Bridge パターンを使用します。

  1. 実装の実行時バインディングが必要な場合、
  2. 結合されたインターフェースと多数の実装に起因するクラスの急増があり、
  3. 複数のオブジェクト間で実装を共有したい場合は、直交クラス階層をマップする必要があります。

ウィキペディアからの Bridge の UML ダイアグラム:

ここに画像の説明を入力

UML ダイアグラムから、違いを確認できます。

Decorator パターンでは、Decorator は Component を実装しています。これは、実行時に ConcreteComponent に置き換えられます

Bridge パターンでは、RedefinedAbstraction は Implementor を実装していません。代わりに、コンポジションを使用して、Implementor がクライアントの知識なしで実行時に動的に変更できるようにします。

Bridge パターンとは異なり、Decorator は抽象化を実装から切り離すことができません。

その他の役立つ投稿:

Decorator パターンを使用する場合

ブリッジ パターンはいつ使用しますか? Adapter パターンとどう違うのですか?

于 2016-05-30T07:34:55.013 に答える
1

ブライアンは正しいです。概念的に追加します。クライアントは、基になるオブジェクトへのブリッジを使用していることを「認識」しますが、デコレーターを使用すると、クライアントは、それとターゲット オブジェクトの間にデコレーター レイヤーがあることを認識できません。

ブリッジの目的は、クライアントを保護するための抽象化レイヤーを作成することです。デコレータの目的は、クライアントが知らないうちにオブジェクトに機能を追加することです。ほとんどのデコレーターは、デコレーターが変更するように設計されているものに直接関連する関数を除いて、すべての関数呼び出しを親クラスへのポインターに直接渡します。

于 2010-02-12T19:40:57.083 に答える