プラグ可能なアダプターの概念を良い例で説明してくれる人はいますか?
3 に答える
Google の結果をざっと読んで理解したところによると、プラグ可能なアダプターは、特定のアダプターに対してハードコードされていないアダプターです。表面 (アダプタ自体のインターフェイス) では、すべて同じですが、異なるインターフェイスを持つ異なるアダプティに適応できます。このスレッドはかなり説明的であることがわかりました:
基本的には、リフレクションを使用することで、コンパイル時にアダプティ (レシーバー) プロトコルが不明な場合にアダプターを組み込むことができます。アダプター インスタンスを作成するときは、呼び出すアダプティーのメソッドの名前と、入力型の変換に必要なメタデータを渡します。アダプタは、ターゲット インターフェイスのメソッド呼び出しを受け取ると、リフレクションを使用して、アダプティで指定された対応するメソッドを呼び出します。
そしてこれ:
ビューアの主な役割は、ドメイン自体について何の仮定もせずに、ドメイン モデルからウィジェットを設定することです。JFace ビューアーは、Pluggable Adapter パターンの Delegating Objects メカニズムを使用して、上記の要件を実装します。
エイリアンのフェイスハガーと考えてください。それが顔を抱きしめるとき、あなたが見るのはフェイスハガーのぬるぬるした背中だけです。スティックで突いて、アーム (アダプター インターフェース) をこじ開けてみることができます。ただし、基本的には、顔の特徴に関係なく、あらゆる人間 (順応者) の顔を抱きしめることができます。多分私はそれを少し押しているかもしれませんが、ねえ、私はエイリアンが大好きです.
アダプター/プラグ可能パターンに関するこの記事を読むことができます。
この記事の目次:
* 1 Design Patterns
* 2 Intent of Adapter
* 3 Motivation
* 4 Structure
* 5 Applicability
* 6 Consequences
* 7 Implementation
o 7.1 Known Uses and Sample Code
o 7.2 Related Patterns
* 8 Conclusions
* 9 Appendix
o 9.1 References
o 9.2 Glossary
見積もり:
Smalltalk は、ビルトイン インターフェイス アダプテーションを使用してクラスを記述するために、「プラグ可能アダプタ」の概念を導入しました。この興味深い概念により、クラスへの異なるインターフェイスを期待する可能性のある既存のシステムにクラスを導入できます。この手法は、モジュールやプロジェクト間でのクラスの再利用を促進するのに役立ちます。
以下に小さな例を示します。
いくつかの文字列をコンソールに出力する Foo と Boo の 2 つのクラスがあります。アダプター クラスは、クライアントが必要とするインターフェイス (SaySomething) を提供するために、両方のクラスのメソッドを適合させることができます。インターフェイス名に依存しないことに注意してください。SayHey メソッドと Bark メソッドの両方を簡単に適応させることができます。
class Foo
{
public static void SayHey() { Console.WriteLine("Hey!"); }
}
class Boo
{
public static void Bark() { Console.WriteLine("Woof!"); }
}
class Adapter
{
public Action SaySomething { get; private set;} // "pluggable" adapter
public Adapter(Action saySomethingAction)
{
SaySomething = saySomethingAction;
}
}
class Program
{
static void Main(string[] args)
{
(new Adapter(Foo.SayHey)).SaySomething();
(new Adapter(Boo.Bark)).SaySomething();
}
}
Pluggable Adapter の際立った特徴は、クライアントによって呼び出されるメソッドとインターフェースに存在するメソッドが異なる可能性があることです。
interface Ilegacy
{
float calculate(int a, int b);
}
class Legacy : Ilegacy
{
public float calculate(int a, int b)
{
return a * b;
}
}
class Adapter
{
public Func<int, int, float> legacyCalculator;
public Adapter()
{
this.legacyCalculator = new Legacy().calculate;
}
}
class Client
{
static void Main()
{
float result = new Adapter().legacyCalculator(5, 6);
}
}
これは通常、C# でデリゲート、関数、またはアクションを使用して実現できます。