2009-01-16 4 views

Antwort

3

Sie können this article über Adapter/steckbare Muster lesen:

Inhaltsverzeichnis in diesem Artikel:

* 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 

Zitat:

Smalltalk führte das Konzept eines „steckbare Adapter " Klassen mit integrierter Schnittstelle Anpassung zu beschreiben. Dieses interessante Konzept ermöglicht die Einführung von Klassen in bestehende Systeme, die möglicherweise unterschiedliche Schnittstellen zur Klasse erwarten. Diese Technik kann Klassenwiederverwendung über Module und sogar Projekte fördern. Hier

ist ein kleines Beispiel:

Wir haben zwei Klassen - Foo & Boo, die eine Schnur gibt zu trösten. Die Adapterklasse kann Methoden aus beiden Klassen anpassen, um die vom Client benötigte Schnittstelle (SaySomething) bereitzustellen. Beachten Sie, dass es keine Abhängigkeit vom Schnittstellennamen gibt - wir können SayHey- und Bark-Methoden problemlos anpassen.

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(); 
    } 
} 
+0

ich diesen Artikel beziehen tat acheived. Ich denke du suchst das auch mit Google. Aber es erklärt Pluggable Adapter nicht klar. Es bezieht sich auf GoF-Buch, das ich gelesen habe. –

+0

Der Link zum Artikel ist jetzt unterbrochen. – miguelbgouveia

13

Von dem, was ich von einem schnellen Lesen von Google Ergebnissen verstanden, ein steckbare Adapter ist ein Adapter, der gegen einen bestimmten adaptierten nicht hart codiert. Auf der Oberfläche (die eigene Schnittstelle des Adapters) ist es egal, aber es kann sich an verschiedene Anpassungen mit verschiedenen Schnittstellen anpassen. Ich fand this thread ziemlich erklärend:

Grundsätzlich ermöglicht es Ihnen, in einem Adapter zu setzen, wenn das adaptierte (Empfänger) Protokoll zum Zeitpunkt der Kompilierung nicht bekannt ist durch Reflexion verwendet wird. Wenn Sie die Adapterinstanz erstellen, geben Sie ihr den Namen der anzurufenden Methode des Adaptees, , sowie alle Metadaten, die zum Übersetzen von Eingabetypen erforderlich sind, . Wenn der Adapter einen Methodenaufruf der Zielschnittstelle empfängt, verwendet er die Reflektion , um die auf dem Adaptee angegebene entsprechende Methode aufzurufen.

Und this:

Die Hauptverantwortung des Viewers ist ein Widget aus einer Domäne Modell zu füllen, ohne irgendwelche Annahmen über Domain. Der JFace-Viewer verwendet den Mechanismus Delegierende Objekte in Pluggable Adapter Pattern, um die obige Anforderung zu implementieren.

Facehugger in action

Betrachten Sie es als ein Facehugger von Alien; wenn es ein Gesicht umarmt, sieht man nur den schleimigen Rücken des Gesichtshüters. Sie können es mit einem Stock stoßen und versuchen, seine Arme (die Adapterschnittstelle) abzubrechen. Aber im Grunde kann es das Gesicht jedes Menschen (der Angepasste) umarmen, unabhängig von den Gesichtsmerkmalen. Vielleicht treibe ich es ein bisschen, aber, hey, ich liebe Alien.

+1

Große Analogie! :) – cschol

0

Ein Unterscheidungsmerkmal des Pluggable Adapters ist, dass die vom Client aufgerufene Methode und die in der Schnittstelle 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 in der Regel mit der Verwendung von Delegaten Func oder Aktion in C#

Verwandte Themen