Z mojego doświadczenia wynika, że w tradycyjnym programie GUI mvc na pulpicie kontroler jest spaghetti. Większość ludzi nie poświęca czasu na wyróżnienie klasy kontrolera.
Wzory projektowe w Smalltalk MVC
Triada klas Model / View / Controller (MVC) [KP88] służy do budowania interfejsów użytkownika w Smalltalk-80. Spojrzenie na wzorce projektowe w MVC powinno pomóc ci zrozumieć, co rozumiemy pod pojęciem „wzór”.
MVC składa się z trzech rodzajów obiektów. Model jest obiektem aplikacji, widok jest prezentacją na ekranie, a kontroler określa sposób, w jaki interfejs użytkownika reaguje na dane wprowadzone przez użytkownika. Przed MVC projekty interfejsu użytkownika miały tendencję do zlepiania tych obiektów razem. MVC oddziela je, aby zwiększyć elastyczność i ponownie wykorzystać.
MVC oddziela widoki i modele, ustanawiając między nimi protokół subskrypcji / powiadamiania. Widok musi zapewniać, że jego wygląd odzwierciedla stan modelu. Za każdym razem, gdy zmieniają się dane modelu, model powiadamia widoki od niego zależne. W odpowiedzi każdy widok ma możliwość samodzielnej aktualizacji. Takie podejście umożliwia dołączenie wielu widoków do modelu w celu zapewnienia różnych prezentacji. Możesz także tworzyć nowe widoki modelu bez przepisywania go.
Poniższy schemat przedstawia model i trzy widoki. (Dla uproszczenia zrezygnowaliśmy z kontrolerów). Model zawiera pewne wartości danych, a widoki definiujące arkusz kalkulacyjny, histogram i wykres kołowy wyświetlają te dane na różne sposoby. Model komunikuje się z widokami, gdy zmieniają się wartości, a widoki komunikują się z modelem, aby uzyskać dostęp do tych wartości.
Podany na pierwszy rzut oka przykład ten odzwierciedla projekt, który oddziela widoki od modeli. Ale projekt ma zastosowanie do bardziej ogólnego problemu: odsprzęganie obiektów, dzięki czemu zmiany jednego z nich mogą wpływać na dowolną liczbę innych, nie wymagając od znanego obiektu znajomości szczegółów innych. Ten bardziej ogólny projekt został opisany przez wzorzec projektu Observer (strona 293).
Inną cechą MVC jest możliwość zagnieżdżania widoków. Na przykład panel sterowania przycisków może być zaimplementowany jako złożony widok zawierający zagnieżdżone widoki przycisków. Interfejs użytkownika dla inspektora obiektów może składać się z zagnieżdżonych widoków, które mogą być ponownie użyte w debuggerze. MVC obsługuje zagnieżdżone widoki za pomocą klasy CompositeView, podklasy View. Obiekty CompositeView działają tak jak obiekty View; widoku złożonego można używać wszędzie tam, gdzie można go użyć, ale zawiera także widoki zagnieżdżone i zarządza nimi.
Ponownie możemy myśleć o tym jako o projekcie, który pozwala nam traktować widok złożony tak, jak traktujemy jeden z jego komponentów. Ale projekt ma zastosowanie do bardziej ogólnego problemu, który pojawia się, gdy chcemy pogrupować obiekty i potraktować grupę jak pojedynczy obiekt. Ten bardziej ogólny projekt jest opisany wzorem wzoru Composite (163). Pozwala stworzyć hierarchię klas, w której niektóre podklasy definiują obiekty prymitywne (np. Button), a inne klasy definiują obiekty złożone (CompositeView), które łączą prymitywy w bardziej złożone obiekty.
MVC pozwala również zmienić sposób, w jaki widok reaguje na dane wejściowe użytkownika bez zmiany jego prezentacji wizualnej. Może chcesz zmienić sposób, w jaki reaguje na klawiaturę, na przykład, czy mają to użycie menu pop-up zamiast przycisków sterujących. MVC hermetyzuje mechanizm odpowiedzi w obiekcie Controller. Istnieje hierarchia klasa sterowników, dzięki czemu można łatwo utworzyć nowy kontroler jako odmianie istniejącej.
Widok wykorzystuje instancję podklasy kontrolera do implementacji określonej strategii odpowiedzi; aby wdrożyć inną strategię, wystarczy zastąpić instancję innym rodzajem kontrolera. Jest nawet możliwe, aby zmienić kontroler przedstawia widok w czasie wykonywania dać pogląd zmienić sposób reaguje na działania użytkownika. Na przykład, widok może być wyłączone tak, że nie akceptuje wejście po prostu przez nadanie jej kontroler, który ignoruje zdarzeń wejściowych.
Relacja View-Controller jest przykładem wzorca projektowego Strategy (315). Strategia to obiekt reprezentujący algorytm. Jest to przydatne, gdy chcesz zastąpić algorytm statycznie lub dynamicznie, gdy masz wiele wariantów algorytmu lub gdy algorytm ma złożone struktury danych, które chcesz obudować.
MVC wykorzystuje inne wzorce projektowe, takie jak Metoda fabryczna (107), aby określić domyślną klasę kontrolera dla widoku i Dekorator (175), aby dodać przewijanie do widoku. Ale główne relacje w MVC są określone przez wzorce projektowe Observer, Composite i Strategy.