プロキシ、ラッパー、またはファサードクラスの違いは何ですか
それらはすべて同じように見え、実装を取得してカプセル化し、カプセル化されたオブジェクトのメソッドを呼び出すラッパー/プロキシ/ファサードクラスでメソッドが呼び出されます。
それらが例と異なる理由を示してください。
ありがとう
違いは主に意図にあります。最終的に、それらはすべて「実装を取り、それをラップ」しますが、違いを伝えることが重要です。
ラッパーパターン(別名アダプターパターン)は、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);
}
}
あなたが見たように、多くのデザインパターンは同じ構造を持っています。
違いは、それらの存在の理由にあります-存在のwhy。
プロキシは、リモートオブジェクトを表すローカルオブジェクトとして機能するためにあります。
ラッパーは、既存のオブジェクトをラップしてその動作を拡張/変更するためにあります。
ファサードは、複雑なAPIを単純化し、代わりに単純なAPIを公開するために存在します。
私の知る限り、ラッパーと呼ばれるパターンはありません。行動パターンの1つの一般的な定義のようです。
ファサード
単一のクラスではなく複数のクラスをラップしないでください。その目的は、複雑なAPIを使いやすくすることです。 .NETの例は、WebClient
/HttpWebRequest
を使用するHttpWebResponse
クラスです。
プロキシ
プロキシは元のオブジェクトとして機能しますが、接続の処理や完了時のリソースのクリーンアップなどの追加ロジックが含まれています。
WCFを使用している場合は、WCFサービスインターフェイスを提供してクライアントプロキシを生成できます。
追加のパターン
「ラッパー」でもあるパターンがいくつかあります。