2017-11-02 6 views
1

Ich bin neu in Design Patterns und versuche zu lernen, wie sie typischerweise aussehen. Im Moment versuche ich das Fassadenmuster zu verstehen. Ich habe das Gefühl, dass das Fassadenmuster ein ziemlich weit gefächertes Konzept ist, und so fragte ich mich, ob mein zweites Diagramm als Teil der Fassadenvorlage betrachtet werden würde.Design Patterns - Understanding Facade Pattern

Ich kenne eine typische Fassade Muster im Grunde sieht wie folgt aus (mit der A-Klasse ist die Fassade):

enter image description here

Aber was, wenn wir eine subtilere Diagramm wie dieses:

enter image description here

Würde die A-Klasse immer noch als Facade-Klasse betrachtet oder hängt sie vom Kontext ab?

Antwort

2

Zuerst, um Fassade zu verstehen, ich mag es als eine Art Refactoring zu denken. Stellen Sie sich beide Ihre Diagramme ohne die Fassadenklassen vor. Die Clients müssten direkt mit allen von der Fassade verwalteten Klassen interagieren. Als solche wären sie komplexer, mit mehr Kopplung.

Eine Fassade bietet einen vereinfachten Service für die Clients (Reduzierung der Kopplung), versteckt die Komplexität hinter der Fassade.

Mein Lieblingsbeispiel (in Java) ist die JOptionPane Klasse. In den ersten Versionen von Java war es nicht vorhanden. Wenn Sie einen Ja/Nein-Fragedialog erstellen wollten, mussten Sie (als Client) alle Aufrufe von Dialog, Button usw. verwalten und die Ereignisse behandeln. usw. Diese Komplexität wurde in eine statische Methode in der Fassadenklasse JOptionPane vereinfacht.Hier ist ein UML-Diagramm von https://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/facade.html

enter image description here

Nun zu Ihrer Frage:

Würde die A-Klasse noch eine Fassade-Klasse betrachtet werden oder auf dem Kontext abhängt?

Wenn A ist eine vereinfachte Dienst an den Kunden bereitstellt, die effektiv das komplexe Subsystem B verwendet, C, F und E, ohne die die Kunden interagieren müsste (gekoppelt werden), alle von ihnen direkt, dann würde ich sagen A ist eine Fassade.

0

Natürlich gibt es eine Ausnahme, wenn Sie mit dem zusammengesetzten Designmuster arbeiten, aber normalerweise würde sich die Fassadenklasse in Ihrem Fall nicht ändern. Außerdem können neue Abhängigkeiten jederzeit hinzugefügt werden. Hoffe das hilft.

Great Platform to learn Design Patterns

+0

Hmm, ich dachte Design Patterns wären mehr wie eine Richtlinie und nicht so streng, lassen Sie es je nach Kontext spezifisch machen – Jesper

+0

Es stimmt, dass Sie je nach Kontext wählen können, welches Designmuster anwendbar ist, aber im Allgemeinen sind nur vordefinierte Vorlagen. Dies bedeutet jedoch nicht, dass Sie die Code-Struktur nicht an die Anforderungen Ihres Projekts anpassen können. –

+0

Also würden Sie sagen, dass mein zweites Diagramm ein "maßgeschneidertes" Fassaden-Diagramm sein könnte, aber ist das wahrscheinlich ein anderes Muster? Weil ich kein Muster finden kann, das meinem Beispiel ähnlich sieht ... Vielleicht ist es nicht einmal ein Muster? – Jesper

0

würde ich sagen, dass es von dem Kontext abhängt.

Wenn Sie neu in Design Patterns sind, dann können Sie mit real life stories, die ein Designmuster beschreibt, schneller mit dem Lernen/Verstehen des Themas.

0

Ja, die Klasse A ist im zweiten Beispiel genauso eine Fassade wie in der ersten, insofern A der einzige Zugangspunkt zwischen den Clients und dem "Subsystem" ist. Ob das versteckte Subsystem flach oder hierarchisch ist, ist für die Clients oder tatsächlich für das Muster unwesentlich.

Beachten Sie, dass der wahrgenommene Nutzen einer Fassade etwas proportional zur Komplexität ist, die sie von Clients abstrahiert (verbirgt). Daher kann das erste Beispiel als nützlichere Fassade angesehen werden, da es vier zusätzliche Klassen verbirgt. Das zweite Beispiel verbirgt nur zwei Klassen von den Clients, unter der Annahme, dass sie nur mit B und C in Abwesenheit von A interagieren würden.

+0

Das primäre Ziel der Fassade ist es, Komplexität zu verbergen, ein weiterer Vorteil ist die Abhängigkeit zu verwalten. Wenn wir also wollen, dass Kunden nicht von B, C, E, F abhängen, selbst wenn B; C.E, F einfach sind, könnte eine Fassade eine gute Idee sein. Nein? – granier

+0

Ja, das Reduzieren von Clientabhängigkeiten durch Verschieben dieser Abhängigkeiten zu einer Fassade ist Teil dessen, was das Muster zum Abstrahieren (Verbergen) von Komplexität macht. – jaco0646