Entwurfsmuster in Java: Fortgeschrittenes Niveau mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Entwurfsmuster in Java: Von Bridge bis Visitor

\n\n

Entwurfsmuster sind bewährte Lösungen für typische Aufgaben der Softwarearchitektur. Während grundlegende Muster (Singleton, Factory, Observer) jedem Java-Entwickler bekannt sind, bleiben fortgeschrittene Muster oft im Hintergrund. In diesem Artikel behandeln wir drei leistungsstarke Muster: Bridge, Visitor und Memento. Sie erfahren, wann sie anzuwenden sind, und erhalten fertige Codebeispiele in Java.

\n\n

1. Bridge – Abstraktion von Implementierung trennen

\n\n

Das Bridge-Muster wird verwendet, wenn Abstraktion und ihre Implementierung getrennt werden sollen, damit sie sich unabhängig voneinander ändern können. Dies ist besonders nützlich, wenn es mehrere Änderungsdimensionen gibt (z. B. verschiedene Gerätetypen und verschiedene Fernbedienungen).

\n\n

Wann anwenden: wenn Sie eine „Klassenexplosion“ aufgrund der Kombination verschiedener Varianten vermeiden möchten.

\n\n

Beispiel: Gerätesteuerung

\n\n

Stellen Sie sich vor, wir haben Fernbedienungen (Remote) und Geräte (Device). Wir möchten, dass eine Fernbedienung mit verschiedenen Geräten (TV, Radio) funktioniert.

\n\n
// Implementierung (Device)\ninterface Device {\n    void turnOn();\n    void turnOff();\n    void setVolume(int percent);\n}\n\nclass TV implements Device {\n    @Override\n    public void turnOn() { System.out.println("TV eingeschaltet"); }\n    @Override\n    public void turnOff() { System.out.println("TV ausgeschaltet"); }\n    @Override\n    public void setVolume(int percent) { System.out.println("TV-Lautstärke: " + percent + "%"); }\n}\n\nclass Radio implements Device {\n    @Override\n    public void turnOn() { System.out.println("Radio eingeschaltet"); }\n    @Override\n    public void turnOff() { System.out.println("Radio ausgeschaltet"); }\n    @Override\n    public void setVolume(int percent) { System.out.println("Radio-Lautstärke: " + percent + "%"); }\n}\n\n// Abstraktion (Remote)\nabstract class Remote {\n    protected Device device;\n\n    public Remote(Device device) {\n        this.device = device;\n    }\n\n    public abstract void togglePower();\n    public abstract void volumeUp();\n    public abstract void volumeDown();\n}\n\nclass BasicRemote extends Remote {\n    private boolean isOn = false;\n    private int volume = 10;\n\n    public BasicRemote(Device device) {\n        super(device);\n    }\n\n    @Override\n    public void togglePower() {\n        if (isOn) { device.turnOff(); isOn = false; }\n        else { device.turnOn(); isOn = true; }\n    }\n\n    @Override\n    public void volumeUp() {\n        volume += 5;\n        device.setVolume(volume);\n    }\n\n    @Override\n    public void volumeDown() {\n        volume -= 5;\n        device.setVolume(volume);\n    }\n}\n\n// Verwendung\npublic class BridgeDemo {\n    public static void main(String[] args) {\n        Device tv = new TV();\n        Remote remote = new BasicRemote(tv);\n        remote.togglePower(); // TV eingeschaltet\n        remote.volumeUp();    // TV-Lautstärke: 15%\n\n        Device radio = new Radio();\n        remote = new BasicRemote(radio);\n        remote.togglePower(); // Radio eingeschaltet\n        remote.volumeUp();    // Radio-Lautstärke: 15%\n    }\n}
\n\n

Vorteil: Wir können neue Gerätetypen oder neue Fernbedienungen hinzufügen, ohne vorhandenen Code zu ändern. Das Bridge-Muster eignet sich ideal für plattformübergreifende Anwendungen (z. B. UI auf verschiedenen Betriebssystemen).

\n\n

2. Visitor – Neue Operationen ohne Änderung der Klassen

\n\n

Das Visitor-Muster ermöglicht das Hinzufügen neuer Operationen zu einer Gruppe von Objekten, ohne die Klassen dieser Objekte selbst zu ändern. Es ist eine klassische Methode, um die Einschränkungen der einfachen Dispatch-Mechanismen in Java zu umgehen.

\n\n

Wann anwenden: wenn Sie eine stabile Klassenhierarchie haben, aber häufig neue Operationen hinzufügen (z. B. Export in verschiedene Formate, Berichtserstellung).

\n\n

Beispiel: Export von Formen in verschiedene Formate

\n\n

Wir haben Formen

Blogs

Buchempfehlungen