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