Ich bin sehr vertraut mit dem Befehlsmuster, aber ich verstehe noch nicht den Unterschied in der Theorie zwischen einem Functor und einem Befehl. Insbesondere denke ich an Java-Implementierungen. Beide programmieren im Grunde genommen "Verben", die als Objekte dargestellt werden. Im Fall von Funktoren scheinen jedoch, wie ich aus einigen Beispielen gesehen habe, anonyme innere Klassenimplementierungen üblich. Kann jemand da draußen das für mich schön klären?Was ist der Unterschied zwischen einem Functor- und dem Command-Muster?
Antwort
Ein Funktor ist ein "Syntaxlevel" -Konzept - es verpackt Code in einem Objekt, das syntaktisch wie ein Funktionszeiger behandelt werden kann - d. H. Es kann "aufgerufen" werden, indem man die Parameterliste in Klammern setzt. In C++ könnten Sie eine Klasse zu einem Funktor machen, indem Sie operator() überschreiben.
Ein Befehl im Befehlsmuster ist ein Objekt, das einige ausführbare Funktionen zusammenfasst, aber es muss kein Funktor sein. Zum Beispiel könnte es eine Klasse sein, die eine Schnittstelle ICommand implementiert, die es ermöglicht, dass ihr Befehl durch Aufrufen von Do() ausgeführt wird.
Aus der Beschreibung der Apache Commons Functor Seite:
A Funktors ist eine Funktion, die als ein Objekt manipuliert werden kann, oder ein Objekt eine einzige, allgemeine Funktion darstellt.
Funktoren unterstützen und eine Reihe von leistungsstarken Programmiertechniken fördern, einschließlich:
- Programmierung in einem funktionalen Stil
- Funktionen höherer Ordnung
- interne Iteratoren
- Wiederverwendung und Spezialisierung durch Komposition statt Vererbung und Überlastung
- generische "Rückruf" oder "Erweiterungspunkt" APIs
- generic „Filter“ oder Prädikat APIs
- viele „behavioral“ Design Patterns, wie Besucher, Strategie, Zuständigkeitskette usw.
Ein Funktor ist eine Implementierung, ein Weg, um ein Objekt verhalten sich wie eine Funktion.
Das 'Befehlsmuster' ist ein Entwurfsmuster.
Der Funktor ist eine Möglichkeit, das 'Befehlsmuster' zu implementieren.
@Martin York: Sie könnten "Marketing" hinzufügen - Command hat besseres Marketing als "Functor". –
Ich denke an einen Funktor als eine Komponente des Befehlsmusters, die auch andere Infrastruktur wie die Aufrufer und Befehlsempfänger beteiligt.
Das Befehlsmuster wird in Java verwendet, da es in Java keine Closures gibt. Funktoren ist ein Versuch, Schließungen zu implementieren.
Eine Sprache mit Schließungen benötigt das Befehlsmuster nicht.
Es wäre wahrscheinlich fairer zu sagen, dass (einige Formen von) das Befehlsmuster mit Verschlüssen viel einfacher implementiert werden kann. (Und wenn der Befehl beispielsweise das Rückgängigmachen unterstützt, benötigen Sie mehr als nur einen Abschluss, um ihn zu implementieren.) – JacquesB
Hier kommt die Antwort vom GOF:
Coplien beschreibt, wie functors, Objekte zu implementieren, die Funktionen sind, in C++ [Cop92].Er erreicht einen Grad von Transparenz in ihrer Verwendung von Überlastung der Funktionsaufruf-Operator (Operator()). Das Befehlsmuster ist unterschiedlich; dessen Schwerpunkt auf ein bindendes zwischen einem Empfänger und einem Funktion (d.h. action) aufrechterhalten wird, nicht nur eine Funktion beibehalten wird.
Gemäß GOF (Gang of Four) zitierte Definition (von Comptrol), Functor und Command sind zwei verschiedene Muster.
Wie bereits erwähnt, stellt Functor eine Klasse eine Service-Methode, mit anderen Worten enthält: die Hauptverantwortung für die Funktor-Klasse ist die spezifische Logik in einem eigenen Verfahren implementiert zu speichern. Daher können wir an den Funktor denken, wie ein Behälter für die innere Logik seiner eigenen Methode ist. Historisch betrachtet, besteht Functor darin, dass in der Java-Spezifikation die Implementierung und/oder das Konzept des 'Funktionszeigers' nicht vorhanden ist, was im Kontext registrierter Rückrufe (spezifische Implementierung für das Beobachtermuster) sehr nützlich ist.
Das Befehlsmuster stellt ein Entwurfsmuster dar, mit dem eine aufrufende Entität von einem Empfänger entkoppelt werden soll. Es wird hauptsächlich verwendet, wenn es erforderlich ist, die Aktionen (das Generieren der Ereignisse) von den Aktionslistenern zu unterscheiden (denke an GUIs). Es hat eine Methode, die für die Ausführung einer bestimmten Operation verantwortlich ist (abhängig von der speziellen Befehlsimplementierung von ihrer eigenen Oberklasse), die sich auf einen spezifischen Objektempfänger bezieht; In der angegebenen Definition kann die Ausführungsmethode als "nicht intelligent" definiert werden, in der Tat könnte eine intelligente Implementierung selbst eine operative Logik implementieren, anstatt sie an ein drittes Objekt zu delegieren. Wenn wir eine intelligente Ausführungsmethode haben, implementieren wir einen Funktor, und wir setzen den Funktor (spezifische Befehlsunterabschnitt-Implementierung) in den Kontext des Befehlsmusters.
Ich hoffe, dass dies für Sie hilfreich sein wird.
Es ist erwähnenswert, dass ein Funktor verwendet werden könnte, um das Befehlsmuster zu implementieren. Die meisten objektorientierten Programmierer würden jedoch ein Objekt wählen, das eine Befehlsschnittstelle implementiert. –