Java-Entwurfsmuster (design patterns): Adapter

Heute werfen wir einen Blick auf das erste Entwurfsmuster (Java design patterns) aus der Kategorie der strukturellen Muster (Structural Patterns): Adapter Entwurfsmuster in dieser Kategorie befassen sich mit Klassenstrukturen wie Vererbung (inheritance) und Komposition (composition). Lies mehr über weitere Design Patterns – eine Serie von Entwurfsmustern:

Was ist das Adapter Design Pattern?

Adapter ist ein Entwurfsmuster, das die Kommunikation zwischen zwei bestehenden Klassen oder Schnittstellen ermöglicht, die aufgrund der Inkompatibilität ihrer Schnittstellen nicht miteinander kommunizieren können. Adapter ermöglicht die Zusammenarbeit dieser inkompatiblen Teile, indem er eine vermittelte Schnittstelle bereitstellt.

Welches Problem löst das Entwurfsmuster Adapter?

Adapter löst also das Problem der Kommunikation zwischen inkompatiblen Teilen von Komponenten, indem er eine Zwischenschicht zwischen ihnen schafft und Aufrufe zwischen Schnittstellen weiterleitet. Adapter ist nützlich, wenn wir bestehenden Code oder Klassen mit neuem Code integrieren müssen, der ein anderes Schnittstellenformat erwartet. Anstelle den Code der bestehenden Klassen zu ändern, können wir einen Adapter erstellen, der die Kommunikation vermittelt. Mit diesem Designmuster kann man auch in Java arbeiten, insbesondere mit sogenannten Wrapper-Klassen oder -Objekten. Wrapper-Klassen erstellen Objekttypen aus primitiven Datentypen, indem sie diese in einen Adapter einwickeln, der dann die gewünschten Eigenschaften des Objekttyps implementiert. Das hat zur Folge, dass wir mit einer Instanz der Klasse Integer arbeiten können, als ob wir mit einer normalen Variable vom Typ int arbeiten würden.

Beispiel für die Implementierung des Adapter-Musters in Java

Jetzt zeigen wir, wie das Adapter-Muster in Java implementiert werden kann. Wir verwenden die Schnittstelle Tvar, um die Fläche einer beliebigen Form zu berechnen. Tvar.java

package designpatterns;

public interface Tvar {
    public int vypocitajObsah(int x);
}

Diese Schnittstelle wird auch von der Implementierung der Klasse Stvorec verwendet. Stvorec.java

package designpatterns;

// Aktuálna implementácia rozhrania Tvar
public class Stvorec implements Tvar {
    @Override
    public int vypocitajObsah(int x) {
        return x * x;
    }
}

Wir würden auch gerne eine externe Implementierung für die Berechnung des Inhalts des Kreises verwenden, die von einem Drittanbieter bereitgestellt wird. Diese implementiert jedoch nicht unsere Schnittstelle Shape, die wir nicht ändern können, da sie bereits verwendet wird. Kruh.java

package designpatterns;

// Implementácia triedy Kruh dodaná externe cez knižnicu
public class Kruh {
    public double vypocitajObsahKruhu(int r) {
        return 3.14 * r * r;
    }
}

Die Lösung besteht darin, die Implementierung von Kruh an unser Interface Tvar anzupassen. Wir brauchen also einen Adapter, da die Methoden nicht kompatibel sind. KruhAdapter.java

package designpatterns;

public class KruhAdapter extends Kruh implements Tvar {
    @Override
    public int vypocitajObsah(int x) {
        return (int) vypocitajObsahKruhu(x);
    }
}

Main.java: Jetzt können wir sowohl die Formen Stvorec als auch Kruh (über den Adapter KruhAdapter) verwenden und die Methode zur Berechnung der Fläche auf beiden aufrufen.

import designpatterns.KruhAdapter;
import designpatterns.Stvorec;
import designpatterns.Tvar;

// Použitie vzoru adapter
public class Main {
    public static void main(String[] args) {
        Tvar kruh =  new KruhAdapter();
        System.out.println("Obsah kruhu: " + kruh.vypocitajObsah(4));
        Tvar stvorec = new Stvorec();
        System.out.println("Obsah štvorca: " + stvorec.vypocitajObsah(4));
    }
}

Die Ausgabe dieses Beispiels ist: Nach der Verwendung der Formen Stvorec und Kruh mithilfe des Adapters KruhAdapter nutzen wir die Methode zur Berechnung der Fläche.

Zusammenfassung

Das Entwurfsmuster Adapter wird in einer Situation verwendet, in der eine Klasse eine andere Schnittstelle haben muss als die, die sie derzeit hat. Der Adapter ermöglicht die Zusammenarbeit von Klassen, die sonst aufgrund unterschiedlicher Schnittstellen nicht zusammenarbeiten könnten. Der Adapter kann je nach verwendeter Implementierung in Klassenadapter und Objektadapter klassifiziert werden. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Code Java Adapter hier herunter.

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich