70

プロキシ、ラッパー、またはファサードクラスの違いは何ですか

それらはすべて私には同じように見えます。実装を取り、それをカプセル化してから、カプセル化されたオブジェクトのメソッドを呼び出すラッパー/プロキシ/ファサードクラスでメソッドが呼び出されます。

それらが異なる理由を例を挙げて示してください。

ありがとう

4

3 に答える 3

64

違いは主に意図にあります。最終的には、それらはすべて「実装を取り、それをラップする」のですが、違いを伝えることが重要です。

ラッパーパターン(別名アダプターパターン)は、一方のインターフェイスを取り、それをもう一方のインターフェイスに適合させます。

interface A { void Foo(); }
interface B { void Bar(); }

class AAdapter : B { 
   private A a;
   public AAdapter(A a) { this.a = a; }

   void Bar() {
      a.Foo(); // just pretend foo and bar do the same thing
   } 
}

プロキシは、他の何か(通常は大きなもの)へのアクセスを提供する目的でインターフェースを実装します。良い例は、リモートプロシージャコールです。

interface PiCalculator {
    double CalculatePi();
}

class Ec2PiCalculatorProxy : PiCalculator {
    public double CalculatePi() {
       // Fire up 10000 of computers in the cloud and calculate PI
    }
}

これをラッパーではなくプロキシと呼び、結果を実現するために別のコンポーネントにトンネリングしていることを伝えます。これはアダプタパターンと同じではありません。これは、インターフェイスの変換に関するものだからです。

ファサードは、複数のクラスのコラボレーションをより単純なインターフェイスまたはクラスの背後に隠すため、異なります。

class Facade {
  private A a;
  private B b;

  // Provides an interface to A and B by delegating to these members  

  public void DoSomethingWithAAndB() {
    MagicToken x = a.DoSomethingAndGetAResult();
    b.DoSomethingWithMagic(x);
  } 
}
于 2012-09-06T09:00:49.930 に答える
36

ご覧のとおり、多くのデザインパターンは同じ構造になっています。

違いは、彼らが存在する理由、つまり彼らが存在する理由にあります。

プロキシは、リモートオブジェクトを表すローカルオブジェクトとして機能するためにあります。

ラッパーは、既存のオブジェクトをラップしてその動作を拡張/変更するためにあります。

複雑なAPIを単純化し、代わりに単純なAPIを公開するためのファサードが存在します。

于 2012-09-06T08:58:42.710 に答える
8

AFAIKラッパーと呼ばれるパターンはありません。行動パターンの1つの一般的な定義のようです。

ファサード

1つのクラスではなく、複数のクラスをラップします。目的は、複雑なAPIを操作しやすくすることです。.NETの例は、/WebClientを使用するクラスです。HttpWebRequestHttpWebResponse

プロキシー

プロキシは元のオブジェクトとして機能しますが、接続の処理や完了時のリソースのクリーンアップなどの追加のロジックが含まれています。

WCFを使用している場合は、WCFサービスインターフェイスを提供することでクライアントプロキシを生成できます。

追加のパターン

「ラッパー」でもあるパターンがいくつかあります。

  • アダプタ
  • デコレータ
于 2012-09-06T12:10:06.757 に答える