Was ist der Unterschied zwischen den Entwurfsmustern für Fassade, Proxy, Adapter und Dekorateur?
Ich habe nie eine klare Erklärung gelesen, was ist deine?
Was ist der Unterschied zwischen den Entwurfsmustern für Fassade, Proxy, Adapter und Dekorateur?
Ich habe nie eine klare Erklärung gelesen, was ist deine?
Antworten:
Der Adapter passt eine bestimmte Klasse / ein bestimmtes Objekt an eine neue Schnittstelle an. Im ersteren Fall wird typischerweise eine Mehrfachvererbung verwendet. Im letzteren Fall wird das Objekt von einem konformen Adapterobjekt umschlossen und herumgereicht. Das Problem, das wir hier lösen, sind nicht kompatible Schnittstellen .
Fassade ist eher ein einfaches Tor zu einem komplizierten Funktionsumfang. Sie machen eine Blackbox für Ihre Kunden, um sich weniger Sorgen zu machen, dh um die Schnittstellen zu vereinfachen .
Proxy bietet die gleiche Schnittstelle wie die Proxy-for-Klasse und erledigt normalerweise einige Housekeeping-Aufgaben selbstständig. (Anstatt mehrere Kopien eines schweren Objekts zu X
erstellen, erstellen Sie Kopien eines leichtgewichtigen Proxys, P
der X
Ihre Anrufe nach Bedarf verwaltet und übersetzt.) Sie lösen das Problem, dass der Client ein schweres und / oder komplexes Objekt verwalten muss .
Decorator wird verwendet, um Ihren Objekten mehr Schießpulver hinzuzufügen (beachten Sie den Begriff Objekte - normalerweise dekorieren Sie Objekte zur Laufzeit dynamisch). Sie verbergen / beeinträchtigen die vorhandenen Schnittstellen des Objekts nicht, sondern erweitern es einfach zur Laufzeit .
Nachdem Sie nun den Dekorateur involviert haben, möchten Sie wahrscheinlich wissen, warum die Betonung des Wortobjekts - einige Sprachen (wie Java) erlauben einfach keine virtuelle Vererbung (dh Mehrfachvererbung wie in C ++), damit Sie dies erreichen können Kompilierzeit.
Da wir mehrere Vererbungen (und den gefürchteten Diamanten) hineingezogen haben, werden Sie nach Mixins Ausschau halten - bei denen es sich um eine lineare Verkettung von Schnittstellen handelt , um die Probleme der Mehrfachvererbung zu umgehen. Mixins mischen sich jedoch nicht so gut. Und am Ende haben wir Merkmale - ja, diese zustandslosen kleinen Verhaltensblobs , die in Vorlagenparametern in C ++ ständig angezeigt werden. Merkmale versuchen, die Probleme der Zusammensetzung und Zerlegung von Verhalten auf elegante Weise anzugehen, ohne auf Mehrfachvererbungen oder geordnete Verkettungen zurückzugreifen.
Fassade
Sie können beispielsweise eine Fassade verwenden, um das Aufrufen einer API zu vereinfachen. Schauen Sie sich dieses Beispiel einer entfernten Fassade an. Die Idee dabei ist, dass die vollständige Implementierung des Codes auf dem Server vor dem Client verborgen ist. Der Client ruft eine API-Methode auf, die wiederum einen oder mehrere API-Aufrufe auf dem Server ausführen kann.
Adapter
Ein gutes Beispiel dafür finden Sie hier auf Wikipedia. Ein Client-Objekt Source
möchte eine Methode für ein anderes Objekt aufrufen Target
, aber die Schnittstelle dieses anderen Objekts unterscheidet sich von den Erwartungen des Clients.
Geben Sie das Adapterobjekt ein.
Es kann einen Aufruf vom Source
Objekt entgegennehmen und hinter den Kulissen die Target
Methode aufrufen, die verwendet werden soll.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Was Proxy betrifft, habe ich keine Erfahrung mit diesem Entwurfsmuster.