Brücken-Muster

Bridge-Muster wird verwendet, um Abstraktion von Implementierung zu entkoppeln, sodass beide unabhängig variieren können. Diese Art von Entwurfsmuster ist ein Strukturmuster, das die beiden entkoppelt, indem es eine Brückenstruktur zwischen Abstraktion und Implementierung bereitstellt.

Dieses Muster beinhaltet eine Schnittstelle, die als Brücke fungiert, sodass die Funktionalität von Entitätsklassen unabhängig von den Schnittstellen-Implementierungsklassen ist. Diese beiden Klassentypen können strukturell geändert werden, ohne sich gegenseitig zu beeinflussen.

Der Zweck des Bridge-Musters besteht darin, Abstraktion von Implementierung zu trennen, sodass sie unabhängig variieren können. Das Muster trennt den abstrakten Teil eines Objekts von seinem Implementierungsteil, wodurch sie sich unabhängig ändern können. Es verbindet die abstrakten und die Implementierungsteile durch Komposition statt durch Vererbung.

Wir verwenden das folgende Beispiel, um die Verwendung des Bridge-Musters zu demonstrieren. Hier können wir dieselben abstrakten Klassenmethoden, aber unterschiedliche Bridge-Implementierungsklassen verwenden, um Kreise in verschiedenen Farben zu zeichnen.

Einführung

Absicht

Dient dazu, den abstrakten Teil vom Implementierungsteil zu trennen, damit sie unabhängig voneinander variieren können.

Wesentliche gelöste Probleme

Vermeidet das durch Vererbung verursachte Problem der Klassenexplosion und bietet eine flexiblere Möglichkeit zur Erweiterung.

Anwendungsfall

Das Bridge-Muster eignet sich, wenn ein System aus mehreren Perspektiven klassifiziert werden kann und jede Perspektive unabhängig variieren kann.

Implementierungsansatz

  • Trennung der Klassifizierung aus mehreren Blickwinkeln: Trennt die Klassifizierungslogik von verschiedenen Perspektiven, sodass sie unabhängig variieren können.
  • Kopplung reduzieren: Reduziert die Kopplung zwischen Abstraktion und Implementierung.

Schlüsselcode

  • Abstrakte Klasse: Definiert eine abstrakte Klasse als Teil des Systems.
  • Implementierungsklasse: Definiert eine oder mehrere Implementierungsklassen, die über Aggregation (statt Vererbung) mit der abstrakten Klasse verbunden sind.

Anwendungsbeispiel

  • Reinkarnation: Die Trennung von Seele (Abstraktion) und Körper (Implementierung), wodurch die Seele verschiedene Körper wählen kann.
  • Wandschalter: Die Trennung von Schalter (Abstraktion) und interner Implementierung (Implementierung); Benutzer müssen sich nicht um die interne Funktionsweise des Schalters kümmern.

Vorteile

  • Trennung von Abstraktion und Implementierung: Verbessert die Flexibilität und Wartbarkeit des Systems.
  • Starke Erweiterbarkeit: Abstraktion und Implementierung können unabhängig voneinander erweitert werden.
  • Transparente Implementierungsdetails: Benutzer müssen die Implementierungsdetails nicht verstehen.

Nachteile

  • Schwierigkeit des Verständnisses und Designs: Das Bridge-Muster erhöht die Schwierigkeit, das System zu verstehen und zu entwerfen.
  • Aggregations-Assoziation: Erfordert, dass Entwickler auf der Abstraktionsebene entwerfen und programmieren.

Verwendungshinweise

  • Verwenden Sie das Bridge-Muster, wenn das System die Flexibilität zwischen der Abstraktionsrolle und der konkreten Rolle erhöhen muss.
  • Das Bridge-Muster eignet sich besonders für Systeme, bei denen Vererbung unerwünscht ist oder bei denen mehrstufige Vererbung zu einem starken Anstieg der Anzahl von Klassen führt.
  • Verwenden Sie das Bridge-Muster, wenn eine Klasse zwei unabhängig variierende Dimensionen hat und beide Dimensionen erweitert werden müssen.

Hinweise

  • Das Bridge-Muster eignet sich für zwei unabhängig variierende Dimensionen und stellt sicher, dass sie unabhängig erweitert und geändert werden können.

Struktur

Das Folgende sind mehrere Schlüsselrollen des Bridge-Musters:

  • Abstraktion: Definiert die abstrakte Schnittstelle, die normalerweise eine Referenz auf die Implementierungsschnittstelle enthält.
  • Verfeinerte Abstraktion: Eine Erweiterung der Abstraktion, die eine Unterklasse der abstrakten Klasse oder eine konkrete Implementierungsklasse sein kann.
  • Implementierer: Definiert die Implementierungsschnittstelle und stellt die Schnittstelle für grundlegende Operationen bereit.
  • Konkreter Implementierer: Eine konkrete Klasse, die die Implementierungsschnittstelle implementiert.

Implementierung

Wir haben eine ... als die Brückenimplementierung.DrawAPISchnittstellen und ImplementierungenDrawAPIEntitätsklassen der SchnittstelleRedCircle、GreenCircle。Shapeist eine abstrakte Klasse, dieDrawAPIdas Objekt verwendet.BridgePatternDemoKlassenverwendungShapeKlasse zum Zeichnen von Kreisen in verschiedenen Farben.

桥接模式的 UML 图

Schritt 1

Erstellen Sie eine Schnittstelle für die Brückenimplementierung.

DrawAPI.java

public interface DrawAPI { public void drawCircle(int radius, int x, int y); }

Schritt 2

Erstellen Sie eine ImplementierungDrawAPIKonkrete Brückenimplementierungsklassen für die Schnittstelle.

RedCircle.java

public class RedCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Kreis zeichnen [ Farbe: rot, Radius: " + radius +", x: " +x+", "+ y +"]"); } }

GreenCircle.java

public class GreenCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Kreis zeichnen [ Farbe: grün, Radius: " + radius +", x: " +x+", "+ y +"]"); } }

Schritt 3

VerwendungDrawAPIErstellen abstrakter Klassen aus SchnittstellenShape。

Shape.java

public abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI){ this.drawAPI = drawAPI; } public abstract void draw(); }

Schritt 4

Eine Implementierung erstellenShapeKonkrete Klassen der abstrakten Klasse.

Circle.java

public class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } public void draw() { drawAPI.drawCircle(radius,x,y); } }

Schritt 5

VerwendungShapeundDrawAPIDie Klasse zeichnet Kreise in verschiedenen Farben.

BridgePatternDemo.java

public class BridgePatternDemo { public static void main(String[] args) { Shape redCircle = new Circle(100,100, 10, new RedCircle()); Shape greenCircle = new Circle(100,100, 10, new GreenCircle()); redCircle.draw(); greenCircle.draw(); } }

Schritt 6

Führen Sie das Programm aus, geben Sie die Ergebnisse aus:

Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[  color: green, radius: 10, x: 100, 100]

Empfehlungen zu verwandten Artikeln

Brücken-Muster

Weitere Erweiterungen