web-dev-qa-db-ja.com

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

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

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

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

ありがとう

50
Jon

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

ラッパーパターン(別名アダプターパターン)は、1つのインターフェイスを受け取り、それを他のインターフェイスに適合させます。

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);
  } 
}
49
Jeff Foster

あなたが見たように、多くのデザインパターンは同じ構造を持っています。

違いは、それらの存在の理由にあります-存在のwhy

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

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

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

26
Oded

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

ファサード

単一のクラスではなく複数のクラスをラップしないでください。その目的は、複雑なAPIを使いやすくすることです。 .NETの例は、WebClient/HttpWebRequestを使用するHttpWebResponseクラスです。

プロキシ

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

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

追加のパターン

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

  • アダプタ
  • デコレータ
6
jgauffin