Arbeiten mit dem Adapter-Entwurfsmuster

Entwurfsmuster sind Lösungen für wiederkehrende Probleme und Komplexitäten im Software-Design. Entwurfsmuster werden als kreativ, strukturell oder verhaltensbezogen kategorisiert. Erstellungsmuster werden verwendet, um den Mechanismus zum Erstellen von Instanzen von Klassen zu erstellen und zu verwalten. Strukturmuster werden verwendet, um die Beziehungen zwischen den Entitäten zu realisieren. Verhaltensentwurfsmuster befassen sich mit der Zusammenarbeit von Objekten und der Übertragung von Verantwortlichkeiten.

Das Adaptermuster ist ein strukturelles Entwurfsmuster, das als Brücke zwischen zwei nicht kompatiblen Schnittstellen fungiert. Der Begriff "Adapter" wird verwendet, um ein Objekt darzustellen, mit dem zwei miteinander inkompatible Schnittstellen kommunizieren und zusammenarbeiten können. Im Wesentlichen ermöglicht das Adaptermuster, dass Klassen (mit inkompatiblen Schnittstellen) zusammenarbeiten und ihre Objekte bei Bedarf kommunizieren.

Es gibt bestimmte Arten von Adaptern, die die Schnittstellen sowohl des Ziels als auch des Adaptees implementieren. Solche Adaptertypen sind als Zweiwege-Adapter bekannt. Sie haben auch zwei verschiedene Arten von Adaptern, nämlich Klassenadapter und Objektadapter. Während der erstere die Vererbung verwendet, verwendet der letztere die Komposition, um Inkompatibilitätsprobleme in Ihren Entwürfen zu beheben. Sie können das Adapterentwurfsmuster verwenden, wenn Sie eine Bibliothek eines Drittanbieters verwenden müssen, die nicht mit den Typen kompatibel ist, die Sie in Ihrer Anwendung haben.

Im Folgenden finden Sie eine Liste der Typen, die an einer typischen Implementierung des Adaptermusters beteiligt sind:

  • Ziel
  • Adapter
  • Adaptee
  • Klient

Lassen Sie uns dies anhand eines Beispiels verstehen. Angenommen, zwei Personen, die verschiedene Sprachen sprechen und verstehen, müssen miteinander kommunizieren - eine kann Französisch und die andere Deutsch sein. Diese beiden Personen können also nur Französisch und Deutsch sprechen und verstehen - nicht beide. Normalerweise benötigen Sie jemanden (einen Dolmetscher), der beide Sprachen beherrscht, um die Kommunikation zu erleichtern. Die Person, die diese Kommunikation ermöglichen kann, fungiert also als Adapter.

Dieses Muster fällt unter die Strukturkategorie, da Sie dieses Muster verwenden würden, um die Typen in unserer Anwendung zu strukturieren. In der Regel kann dieses Muster eine Schnittstelle in eine andere umwandeln. Die Viererbande definiert das Adaptermuster als "Konvertieren Sie die Schnittstelle einer Klasse in eine andere Schnittstelle, die die Clients erwarten. Mit dem Adapter können Klassen zusammenarbeiten, die aufgrund inkompatibler Schnittstellen sonst nicht möglich wären."

Lassen Sie uns jetzt einen Code untersuchen. Betrachten Sie die folgenden zwei Klassen.

public class TargetA

            {

                public void DisplayA()

                {

                    Console.WriteLine("TargetA");

                }

            }

            public class TargetB

            {

                public void DisplayB()

                {

                    Console.WriteLine("TargetB");

                }

            }

Wie Sie sehen können, sind die beiden Klassen nicht kompatibel - sie haben auch keine gemeinsame Basis. Die folgende Codeliste zeigt, wie die Adapterklassen aussehen.

public interface ITargetAdapter

            {

                void ProcessData();

            }

public class AdapterA : ITargetAdapter

            {

                 public TargetA targetA { get; set; }

                 public void Process()

                 {

                     targetA.DisplayA();

                 }

                 public AdapterA(TargetA obj)

                 {

                     targetA = obj;

                 }

            }

            public class AdapterB : ITargetAdapter

            {

                 public TargetB targetB { get; set; }

                 public void Process() { targetB.DisplayB(); }

                 public AdapterB(TargetB obj)

                 {

                     targetB = obj;

                 }

            }

Beachten Sie, dass beide Adapterklassen eine gemeinsame Schnittstelle mit dem Namen ITargetAdapter haben, die diese Klassen implementieren. Jede der beiden Adapterklassen verfügt über einen Argumentkonstruktor, der einen Verweis auf ein Objekt der jeweiligen Zielklassen akzeptiert. Die ITargetAdapter-Schnittstelle enthält die Deklaration der Process () -Methode. Diese Methode wird sowohl von den Adapterklassen implementiert - diese Methoden rufen Display () und die jeweiligen Anzeigemethoden der zuvor implementierten Zielklassen auf.

Die folgende Codeliste zeigt, wie Sie diese Adapterklassen verwenden können.

class Program

    {

        static void Main(string[] args)

        {

            ITargetAdapter adapter = new AdapterA(new TargetA());

            adapter.Process();

            adapter = new AdapterB(new TargetB());

            adapter.Process();

            Console.Read();

        }

Wie Sie im obigen Codefragment sehen können, müssen wir eine Instanz der jeweiligen Zielklasse an den Konstruktor der Adapterklasse übergeben.

Ich werde in meinen nächsten Beiträgen hier Diskussionen über weitere Designmuster präsentieren. Das Adapter-Entwurfsmuster kann eine gute Wahl sein, wenn Sie Legacy-Code in Ihren Anwendungen aufrufen müssen. Weitere Informationen zum Adapter-Entwurfsmuster finden Sie in diesem Artikel.