Evgenii Legotckoi
Evgenii Legotckoi24. September 2018 05:05

Strukturelle Entwurfsmuster - Brücke

Ziele

  • Trennen Sie die Abstraktion von ihrer Implementierung, damit sie sich unabhängig voneinander ändern können.
  • Erstellen Sie eine öffentliche Schnittstelle in einer Vererbungshierarchie und implementieren Sie sie in Ihrer eigenen Vererbungshierarchie.
  • Zusätzlich zur Kapselung, die Verwendung von Isolation

Probleme

"Stärken von Programmierbeziehungen" durch Verwenden einer Unterklasse einer abstrakten Basisklasse, um alternative Implementierungen bereitzustellen. Dadurch wird die Bindung zur Kompilierzeit zwischen Schnittstelle und Implementierung blockiert. Abstraktion und Implementierung können nicht unabhängig voneinander erweitert oder neu definiert werden.


Motivation

Betrachten Sie den Bereich „Thread Scheduling“.

Es gibt zwei Arten von Thread-Schedulern, zwei Arten von Betriebssystemen oder "Plattformen". Angesichts dieses Spezialisierungsansatzes müssen wir für jede dieser beiden Varianten eine Klasse definieren. Wenn wir eine neue Plattform hinzufügen (z. B. die Java Virtual Machine), wie würde unsere Hierarchie aussehen?

Was wäre, wenn wir drei Arten von Thread-Schedulern und vier Arten von Plattformen hätten? Was wäre, wenn wir fünf Arten von Thread-Schedulern und zehn Arten von Plattformen hätten? Die Anzahl der Klassen, die wir definieren müssten, ergibt sich aus der Anzahl der Scheduling-Schemata und der Anzahl der Plattformen.

Das Bridge-Entwurfsmuster schlägt vor, diese exponentiell explosive Vererbungshierarchie in zwei orthogonale Hierarchien umzugestalten – eine für plattformunabhängige Abstraktionen und eine für plattformabhängige Implementierungen.

Diskussion

Zerlegen Sie die Schnittstelle und Implementierung der Komponente in orthogonale Klassenhierarchien. Eine Schnittstellenklasse enthält einen Zeiger auf eine abstrakte Implementierungsklasse. Dieser Zeiger wird mit einer Instanz der konkreten Klasse initialisiert, aber jede nachfolgende Interaktion der Schnittstellenklasse mit der Implementierungsklasse ist auf die Abstraktion beschränkt, die in der Basisimplementierungsklasse unterstützt wird. Der Client interagiert mit der Schnittstellenklasse und „delegiert“ wiederum alle Anforderungen an die Klassenimplementierung.

Das Schnittstellenobjekt ist der vom Client bekannte und verwendete "Handler"; während das Implementierungsobjekt oder der "Körper" sicher gekapselt ist, um sicherzustellen, dass es sich weiterentwickeln oder vollständig ersetzt (oder zur Laufzeit verwendet werden kann.

Verwenden Sie das Brückenmuster, wenn:

  • Sie möchten, dass die Implementierung zur Laufzeit bindet
  • Sie haben eine Zunahme der Anzahl von Klassen, die sich aus einer gekoppelten Schnittstelle und mehreren Implementierungen ergeben,
  • Sie möchten die Implementierung auf mehrere Objekte verteilen,
  • Sie müssen orthogonale Klassenhierarchien abbilden.

Zu den Folgen gehören:

  • Objektschnittstellenzerlegung
  • verbesserte Erweiterbarkeit (Sie können (z. B. Unterklassen) Abstraktions- und Implementierungshierarchien unabhängig voneinander erweitern),
  • Ausblenden von Details vor Kunden.

Bridge ist gleichbedeutend mit dem Handler/Body-Idiom. Es ist ein Entwurfsmechanismus, der eine Implementierungsklasse innerhalb einer Schnittstellenklasse kapselt. Der erste ist der Körper und der zweite der Handler. Der Handler wird vom Benutzer als tatsächliche Klasse behandelt, aber die Arbeit wird im Körper erledigt. „Das Handle/Body-Klassen-Idiom kann verwendet werden, um eine komplexe Abstraktion in kleinere, leichter zu handhabende Klassen zu zerlegen. Das Idiom kann die gemeinsame Nutzung einer einzelnen Ressource durch mehrere Klassen widerspiegeln, die den Zugriff darauf kontrollieren (z. B. Referenzzählung)."

Struktur

Der Kunde möchte sich nicht mit plattformabhängigen Details auseinandersetzen. Das Bridge-Muster kapselt diese Komplexität hinter einer abstrakten Hülle.

Bridge betont die Identifizierung und Trennung der Abstraktion „Schnittstelle“ von der Abstraktion „Implementierung“.

Beispiel

Das Brückenmuster trennt die Abstraktion von ihrer Implementierung, sodass sie unabhängig voneinander variieren können. Ein Beispiel für eine Bridge ist ein Haushaltsschalter, der Lichter, Deckenventilatoren usw. steuert. Der Zweck eines Schalters besteht darin, ein Gerät ein- oder auszuschalten. Tatsächlich kann der Schalter als Zugkette, einfacher Ein-/Ausschalter oder verschiedene Dimmerschalter implementiert werden.

Kontrollliste

  1. Entscheiden Sie, ob es zwei mögliche orthogonale Klassenhierarchien in der Anwendung gibt. Diese unabhängigen Hierarchien können sein: Abstraktion/Plattform oder Domäne/Infrastruktur oder Schnittstelle/Schnittstelle oder Schnittstelle/Implementierung.
  2. Entwickeln Sie eine Trennung der Anliegen: was der Kunde will und was die Plattformen bieten.
  3. Erstellen Sie eine Plattformschnittstelle, die minimal, notwendig und ausreichend ist. Sein Zweck ist es, die Abstraktion von der Plattform zu trennen.
  4. Definieren Sie für jede Plattform eine abgeleitete Klasse dieser Schnittstelle.
  5. Erstellen Sie eine Basisabstraktionsklasse, die ein „Plattformobjekt“ hat und plattformspezifische Funktionalität an dieses delegiert.
  6. Definieren Sie bei Bedarf Spezialisierungen für Abstraktionsklassen.

Faustregeln

  • Der Adapter ermöglicht es Ihnen, mit Klassen zu arbeiten, nachdem sie entwickelt wurden; Die Brücke sorgt dafür, dass sie funktionieren, bevor sie entworfen wurden.
  • Die Brücke wird im Voraus so entworfen, dass sich Abstraktion und Implementierung unabhängig voneinander ändern. Der Adapter modernisiert den Code, sodass die Klassen zusammenarbeiten.
  • State, Strategy, Bridge (und teilweise Adapter) haben ähnliche Entscheidungsstrukturen. Sie alle teilen Elemente des Handler/Body-Idioms. Sie unterscheiden sich in ihrer Absicht – das heißt, sie lösen unterschiedliche Probleme.
  • Die Struktur von State und Bridge ist identisch (außer dass Bridge Klassenhierarchien zulässt, während State nur eine zulässt). Die beiden Muster verwenden dieselbe Struktur, um unterschiedliche Probleme zu lösen: Zustand ermöglicht es, dass sich das Verhalten eines Objekts zusammen mit seinem Zustand ändert, während die Absicht der Brücke darin besteht, die Abstraktion von ihrer Implementierung zu trennen, sodass sie unabhängig voneinander variieren können.
  • Wenn Klassenschnittstellen die Erstellung ihrer Implementierungsklassen delegieren (anstatt sich selbst direkt zu erstellen/zu binden), verwendet das Projekt normalerweise das Abstract-Factory-Muster, um Implementierungen der Objekte zu erstellen.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken