127

私はドファクトリー、ウィキペディア、そして多くのサイトで多くの記事を読んでみました。ブリッジパターンとストラテジーパターンの違いがわかりません。

私はそれらの両方が抽象化をその実装から切り離し、実行時に実装を変更できることを知っています。

しかし、どのような状況で戦略を使用すべきか、またはどのような状況でブリッジを使用すべきかはまだわかりません。

4

14 に答える 14

73

セマンティクス。ウィキペディアから:

ストラテジーパターンのUMLクラス図は、ブリッジパターンの図と同じです。ただし、これら2つのデザインパターンは、意図が同じではありません。ストラテジーパターンは行動を目的としていますが、ブリッジパターンは構造を目的としています。

コンテキストと戦略の間の結合は、ブリッジパターンでの抽象化と実装の間の結合よりも緊密です。

私が理解しているように、外部ソースから提供される可能性のある動作を抽象化する場合は戦略パターンを使用し(たとえば、configはプラグインアセンブリをロードするように指定できます)、使用する場合はブリッジパターンを使用しますコードを少しすっきりさせるための同じ構成。実際のコードは非常によく似ています。わずかに異なる理由でパターンを適用しているだけです。

于 2009-01-21T09:18:51.300 に答える
61

ブリッジ パターンは構造パターンです (ソフトウェア コンポーネントをどのように構築しますか?)。戦略パターンは動的パターンです (ソフトウェアで動作を実行するにはどうすればよいですか?)。

構文は似ていますが、目的は異なります。

  • 戦略: 操作を実行する方法は他にもあります。戦略を使用すると、実行時にアルゴリズムを選択でき、コンパイル時に多くの副作用なしで単一の戦略を変更できます。
  • Bridge : インターフェイスとクラスの階層を分割し、抽象参照で結合できます (説明を参照)
于 2009-01-21T13:34:24.607 に答える
16

私も同じことを考えていましたが、最近ブリッジを使用する必要があり、ブリッジは戦略を使用してコンテキストに抽象化を追加しているため、後でクライアントを変更せずにさらに変更を加えることができることに気付きました。抽象化なしで Strategy を使用する場合、設計はそれほど柔軟ではなく、後でクライアントに変更が必要になる場合があります。しかし、ブリッジ全体を使用すると、設計はさらに柔軟になります。ここでは、ストラテジーからブリッジに移行することで柔軟性が向上することがわかります。また、「ビザ」と「マスター」はカードだけでなく、電話やチップでも利用できるようになったと想定しています。ブリッジを使用すると、そのサポートを追加するのがはるかに簡単になります。

ストラテジー VS ブリッジ

于 2016-09-03T12:51:00.377 に答える
12

ストラテジー:

  • 戦略に関連付けられたコンテキスト: コンテキスト クラス (おそらく抽象的ですが、実際にはインターフェイスではありません! 実装全体ではなく特定の動作をカプセル化する必要があるため) は、戦略インターフェイスの参照と、戦略の動作を呼び出す実装を認識/含みます。それ。
  • 意図は、実行時に動作を交換する機能です

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

  • 実装に結び付けられていない抽象化: 抽象化インターフェース (またはほとんどの動作抽象を含む抽象クラス) は、実装インターフェース参照を認識していない/含んでいない
  • 意図は、実装から抽象化を完全に切り離すことです

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    
于 2011-07-27T16:53:20.123 に答える
9

ブリッジ: (構造パターン)

ブリッジ パターンは、抽象化と実装を分離し、両方を個別に変更できるようにします。

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

  1. 抽象化と実装はコンパイル時に決定されていません
  2. 抽象化と実装は個別に変更する必要があります
  3. 抽象化の実装の変更は、呼び出し元のアプリケーションに影響を与えるべきではありません
  4. クライアントは実装の詳細から隔離されている必要があります。

戦略: (行動パターン)

戦略パターンを使用すると、実行時に一連のアルゴリズムから複数のアルゴリズムを切り替えることができます。

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

  1. 複数のバージョンのアルゴリズムが必要
  2. クラスの動作は、実行時に動的に変更する必要があります
  3. 条件文を避ける

関連記事:

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

戦略パターンの実例

于 2016-02-17T15:41:20.483 に答える
1

パターンの比較(意図の違いなど)についてすでに述べたことに加えて、ブリッジパターンも、抽象化階層側を変更できるように意図的に構造化されています。C#のような言語では、これは、既存のコンシューマーに問題を引き起こさない意図されたバリエーションを許可する方法として、仮想メソッドを含む抽象化ベースがあることを意味する場合があります。それ以外は、2つのパターンはほとんど同じように見えるかもしれません。

于 2011-04-11T14:48:30.300 に答える
1

戦略パターンに関するwikiから

ストラテジーパターンのUMLクラス図は、ブリッジパターンの図と同じです。ただし、これら2つのデザインパターンは、意図が同じではありません。ストラテジーパターンは行動を目的としていますが、ブリッジパターンは構造を目的としています。

コンテキストと戦略の間の結合は、ブリッジパターンでの抽象化と実装の間の結合よりも緊密です。

于 2009-01-21T09:18:11.973 に答える
1

戦略パターンは、実行時にアルゴリズムまたは戦略をプラグインする場合に使用されます。パターンのカテゴリは、オブジェクトの動作を扱うことも意味します。一方、ブリッジは構造パターンであり、オブジェクトの構造階層を扱います。抽象化と実装の間に洗練された抽象化を導入することで、実装か​​ら抽象化を分離します。洗練された抽象化は、プラグインされた実行時戦略 (In Strategy パターン) と混同される可能性があります。ブリッジ パターンは、n 個のクラスを作成しないようにするメカニズムを提供することで、構造的な側面に対処します。

于 2013-10-22T15:46:15.467 に答える