Meiner Erfahrung nach wird der Controller in einem herkömmlichen Desktop-MVC-GUI-Programm in die Ansicht eingeblendet. Die meisten Leute nehmen sich nicht die Zeit, eine Controller-Klasse herauszufiltern.
Entwurfsmuster in Smalltalk MVC
Die MVC-Triade (Model / View / Controller) der Klassen [KP88] wird zum Erstellen von Benutzeroberflächen in Smalltalk-80 verwendet. Wenn Sie sich die Entwurfsmuster in MVC ansehen, können Sie erkennen, was wir unter dem Begriff "Muster" verstehen.
MVC besteht aus drei Arten von Objekten. Das Modell ist das Anwendungsobjekt, die Ansicht die Bildschirmdarstellung und der Controller definiert, wie die Benutzeroberfläche auf Benutzereingaben reagiert. Vor MVC neigten Benutzeroberflächendesigns dazu, diese Objekte zusammenzufassen. MVC entkoppelt sie, um die Flexibilität und Wiederverwendung zu erhöhen.
MVC entkoppelt Ansichten und Modelle, indem ein Abonnement- / Benachrichtigungsprotokoll zwischen ihnen erstellt wird. Eine Ansicht muss sicherstellen, dass ihr Erscheinungsbild den Status des Modells widerspiegelt. Wann immer sich die Daten des Modells ändern, benachrichtigt das Modell die Ansichten, die davon abhängen. Als Antwort erhält jede Ansicht die Möglichkeit, sich selbst zu aktualisieren. Mit diesem Ansatz können Sie einem Modell mehrere Ansichten hinzufügen, um unterschiedliche Präsentationen bereitzustellen. Sie können auch neue Ansichten für ein Modell erstellen, ohne es neu zu schreiben.
Das folgende Diagramm zeigt ein Modell und drei Ansichten. (Wir haben die Controller der Einfachheit halber weggelassen.) Das Modell enthält einige Datenwerte, und die Ansichten, die eine Tabelle, ein Histogramm und ein Kreisdiagramm definieren, zeigen diese Daten auf verschiedene Arten an. Das Modell kommuniziert mit seinen Ansichten, wenn sich seine Werte ändern, und die Ansichten kommunizieren mit dem Modell, um auf diese Werte zuzugreifen.
Ausgehend vom Nennwert spiegelt dieses Beispiel ein Design wider, das Ansichten von Modellen entkoppelt. Der Entwurf ist jedoch auf ein allgemeineres Problem anwendbar: Das Entkoppeln von Objekten, sodass Änderungen an einem eine beliebige Anzahl von anderen beeinflussen können, ohne dass das geänderte Objekt Details der anderen kennen muss. Dieser allgemeinere Entwurf wird durch das Entwurfsmuster Observer (Seite 329) beschrieben.
Ein weiteres Merkmal von MVC ist, dass Ansichten verschachtelt werden können. Beispielsweise kann ein Bedienfeld mit Schaltflächen als komplexe Ansicht mit verschachtelten Schaltflächenansichten implementiert werden. Die Benutzeroberfläche für einen Objektinspektor kann aus verschachtelten Ansichten bestehen, die in einem Debugger wiederverwendet werden können. MVC unterstützt verschachtelte Ansichten mit der CompositeView-Klasse, einer Unterklasse von View. CompositeView-Objekte verhalten sich wie View-Objekte. Eine zusammengesetzte Ansicht kann überall dort verwendet werden, wo eine Ansicht verwendet werden kann. Sie enthält und verwaltet jedoch auch verschachtelte Ansichten.
Auch hier können wir uns ein Design vorstellen, mit dem wir eine zusammengesetzte Ansicht genauso behandeln können, wie wir eine ihrer Komponenten behandeln. Der Entwurf ist jedoch auf ein allgemeineres Problem anwendbar, das auftritt, wenn Objekte gruppiert und die Gruppe wie ein einzelnes Objekt behandelt werden sollen. Dieser allgemeinere Entwurf wird durch das Entwurfsmuster Composite (163) beschrieben. Hiermit können Sie eine Klassenhierarchie erstellen, in der einige Unterklassen primitive Objekte (z. B. Button) und andere Klassen zusammengesetzte Objekte (CompositeView) definieren, die die Primitive zu komplexeren Objekten zusammensetzen.
Mit MVC können Sie auch die Art und Weise ändern, in der eine Ansicht auf Benutzereingaben reagiert, ohne die visuelle Darstellung zu ändern. Sie können beispielsweise die Art und Weise ändern, in der die Tastatur darauf reagiert, oder ein Popup-Menü anstelle von Befehlstasten verwenden. MVC kapselt den Antwortmechanismus in ein Controller-Objekt. Es gibt eine Klassenhierarchie von Controllern, die es einfach macht, einen neuen Controller als Variation eines vorhandenen Controllers zu erstellen.
Eine Ansicht verwendet eine Instanz einer Controller-Unterklasse, um eine bestimmte Antwortstrategie zu implementieren. Um eine andere Strategie zu implementieren, ersetzen Sie einfach die Instanz durch eine andere Art von Controller. Es ist sogar möglich, den Controller einer Ansicht zur Laufzeit zu ändern, damit die Ansicht die Art und Weise ändert, in der sie auf Benutzereingaben reagiert. Beispielsweise kann eine Ansicht deaktiviert werden, damit sie keine Eingaben akzeptiert, indem ihr ein Controller zugewiesen wird, der Eingabeereignisse ignoriert.
Die View-Controller-Beziehung ist ein Beispiel für das Entwurfsmuster Strategy (315). Eine Strategie ist ein Objekt, das einen Algorithmus darstellt. Dies ist nützlich, wenn Sie den Algorithmus entweder statisch oder dynamisch ersetzen möchten, wenn Sie viele Varianten des Algorithmus haben oder wenn der Algorithmus komplexe Datenstrukturen aufweist, die Sie kapseln möchten.
MVC verwendet andere Entwurfsmuster, z. B. die Factory-Methode (107), um die Standard-Controller-Klasse für eine Ansicht anzugeben, und Decorator (175), um einer Ansicht einen Bildlauf hinzuzufügen. Die Hauptbeziehungen in MVC sind jedoch durch die Entwurfsmuster Observer, Composite und Strategy gegeben.