Kann mir jemand das Konzept des steckbaren Adapters anhand eines guten Beispiels erklären?
Antworten
Zu viele Anzeigen?Nach dem, was ich aus einer schnellen Lektüre von Google-Ergebnissen verstanden habe, ist ein steckbarer Adapter ein Adapter, der nicht fest mit einem bestimmten Adapter kodiert ist. An der Oberfläche (der eigenen Schnittstelle des Adapters) ist alles gleich, aber er kann sich an verschiedene Adapter mit unterschiedlichen Schnittstellen anpassen. Ich fand dieses Thema ziemlich erklärend:
Im Grunde genommen ermöglicht es Ihnen Adapter einzusetzen, wenn das Empfänger Protokoll zur Kompilierungszeit nicht bekannt ist durch Verwendung von Reflection. Wenn Sie der Adapterinstanz, übergeben Sie ihr den Namen der aufzurufenden Methode des Adaptees, und auch alle Metadaten, die notwendig sind um Eingabetypen zu übersetzen. Wenn der Adapter einen Methodenaufruf der Zielschnittstelle erhält, verwendet er die Reflexion um die entsprechende Methode aufzurufen die auf dem Adapter angegeben ist.
Und este :
Die Hauptverantwortung ist die Befüllung eines Widgets aus einem Domänen Modell zu füllen, ohne irgendwelche Annahmen zu treffen über die Domäne selbst zu machen. Der JFace-Viewer verwendet den Delegating Objects Mechanismus in Pluggable Adapter Pattern zur Implementierung die obige Anforderung zu implementieren.
Betrachten Sie es als einen Facehugger von Alien Wenn er ein Gesicht umarmt, sieht man nur die schleimige Rückseite des Facehuggers. Man kann ihn mit einem Stock anstupsen und versuchen, seine Arme (die Adapterschnittstelle) abzureißen. Aber im Grunde kann er das Gesicht eines jeden Menschen (des Adaptees) umarmen, unabhängig von den Gesichtszügen. Vielleicht übertreibe ich ein bisschen, aber hey, ich liebe Alien.
Eine Besonderheit des Pluggable Adapters ist, dass die vom Client aufgerufene Methode und die im Interface vorhandene Methode unterschiedlich sein können.
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);
}
}
Dies kann normalerweise durch die Verwendung von Delegate, Func oder Action in C# erreicht werden.