2009-11-23 6 views
6

Wie kann ich wissen, dass ich zu einem bestimmten Zeitpunkt in meiner Anwendungsentwicklung ein Fassadenmuster benötige?Verwendung des Fassadenmusters

Wie kann ich die Linie zwischen Fassadenmuster und Vorlagenmuster zeichnen?

Zum Beispiel: In [this] Artikel, sehen wir, dass int placeOrder(int CustomerID, List<BasketItem> Products) hat eine Reihe von vordefinierten Schritten im Algorithmus. Warum benutzt der Autor hier kein Template-Muster?

+3

Was meinen Sie, indem Sie die Grenze zwischen Fassade und Vorlage ziehen? Fassade ist ein strukturelles Muster und Vorlage ist ein Verhaltensmuster - ich sehe nicht, wie Sie die beiden verbinden können? – RichardOD

Antwort

9

Fassade beschäftigt sich mit Schnittstelle, nicht Umsetzung. Sein Zweck ist es, die interne Komplexität hinter einer einzelnen Schnittstelle zu verbergen, die außen einfach erscheint. In dem Beispiel aus Ihrer Frage verbergen die Fassade vier Klassen (Order, OrderLine, Address, BasketItem) hinter einer einzigen Methode.

Template-Methode befasst sich mit der Implementierung. Sein Zweck besteht darin, den allgemeinen Algorithmus aus mehreren zu extrahieren, die sich nur durch einen "Füllen der Lücken" unterscheiden. Die Template-Methode in der Superklasse implementiert den allgemeinen Algorithmus und jede Unterklasse füllt die Leerzeichen auf ihre eigene spezifische Weise.

Warum also nicht der Autor Template-Muster hier verwenden?

Es wäre sinnvoll, placeOrder eine Vorlage-Methode zu machen, wenn es mehrere ähnliche Versionen der Operation gäbe. Vielleicht könnten ein paar Methoden wie placePhoneOrder, placeInternetOrder, placeManuallyEnteredOrder in eine einzige Vorlage placeOrder mit einigen Unterklassen umgestaltet werden, die nur die {phone, internet, manual} -spezifischen Unterschiede implementieren.

+0

Ausgezeichnet! Ich finde genau das, was ich brauchte. – anonymous

3

Angenommen, Sie haben ein paar Dienste, Bibliotheken oder was auch immer. Diese Bibliotheken benötigen Interoperabilität, um Dienste auf höherer Ebene ausführen zu können. Dann möchten Sie vielleicht die Anrufe und den Initialisierungscode, die normalerweise zusammenkommen, umschließen und eine Reihe von Funktionen anbieten, um diese Details zu verbergen und die Verwendung dieser Dienste für bestimmte Szenarien zu vereinfachen. Dann ist es eine gute Verwendung für Fassadenmuster.

UPDATE: In dem genannten Artikel hat die PlaceOrder-Methode eine einzige Implementierung, die für alle Aufträge funktioniert. Das Vorlagenmuster soll eine Reihe von Schritten vorschreiben, die befolgt werden müssen, aber den Unterklassen erlauben, ihre benutzerdefinierte Implementierung dieser festen Schritte anzubieten. Zum Beispiel, wenn Sie Bestellungen für Fernsehgeräte anders als Bestellungen für Mikrowellen verwendet werden, könnten Sie das Template-Muster verwenden, um einige imaginäre DispatchParcel-Methode neu zu definieren (Mikrowelle als ein einfaches Paket senden, aber Fernsehen mit extra Service, um das schwere Gerät zu heben obere Etage). In unserem Fall ist eine Neuimplementierung von ProcessOrder-Schritten nicht erforderlich, so dass kein Template-Muster benötigt wird, da eine einzige Implementierung für alle Arten von Bestellungen geeignet ist.

7

Das Fassadenmuster eignet sich, wenn Sie ein komplexes System haben, das Sie Clients vereinfacht zugänglich machen möchten, oder Sie möchten eine externe Kommunikationsschicht über ein bestehendes System erstellen, das nicht mit Ihrem System kompatibel ist. Es ist ein strukturelles Muster. Siehe hier: http://en.wikipedia.org/wiki/Facade_pattern

Das Schablonenmuster, auf der anderen Seite, ist ein Verhalten Muster, die Ihnen helfen, wenn sie mit der inneren Implementierung einer Komponente handeln. Siehe hier: http://en.wikipedia.org/wiki/Template_method_pattern