Wzorzec Model-View-Controller

W MVC wyróżniamy 3 główne typy klas: model, widok oraz kontroler.

Model stanowi bramkę dostępową do warstwy biznesowej. Przetrzymuje informacje o aktualnym stanie interfejsu. W pewnych przypadkach model może stanowić bezpośrednio klasę z warstwy biznesowej (np. dla wzorca skrypt transakcji jest to możliwe). Zwykle jednak tworzy się osobne modele (albo wrappery) dla warstwy prezentacji.

Widok z kolei to interfejs graficzny w czystej postaci. W przypadku Silverlight, WPF jest to po prostu plik zawierający elementy XAML. Kluczowym elementem jest zapewnienie aby widok odpowiadał wyłącznie za wizualizacje danych a nie logikę. Często widok definiuje się jako “dumb, humble and passive”. Wszelkie kontrolki po otrzymaniu zdarzenia powinny przekierowywać żądanie do kontrolera np.:

void Button1_Click(object sender, EventArgs e)
{
    Controller controller=new Controller();
    controller.SubmitOrder();
}

Kontroler jest mediatorem między modelem a widokiem. Załóżmy, że użytkownik klika w przycisk. Widok obsługuje zdarzenie i wywołuje odpowiednią metodę kontrolera. Kontroler z kolei jest świadomy warstwy biznesowej i wywołuje stosowną metodę modelu. Następnie widok jest aktualizowany zgodnie ze zmianami w modelu. Widok zatem musi być połączony zarówno z modelem (za pomocą wzorca obserwator) jak i z kontrolerem. Ponadto kontroler jest odpowiedzialny za przełączanie się między widokami. W takim przypadku tworzona jest następna trójka (model, widok, kontroler) i przepływ informacji jest przekierowany do nich.

image

Warto wspomnieć o dwóch różnych rodzajach MVC: pasywny oraz aktywy. W pasywnej odmianie kontroler po wywołaniu odpowiedniej metody modelu powiadamia widok o aktualizacji. W tym przypadku widok jest całkowicie nieświadomy modelu – to kontroler musi zaktualizować odpowiednie kontrolki. Częściej jednak wykorzystany jest typ aktywny opisany już wyżej – widok za pomocą wzorca obserwator (w C# są to zdarzenia) sam dba o odpowiednią synchronizację z modelem.

W następnym poście wspomnę kilka słów o wzorcu Model2 a następnie zajmę się już przykładowymi implementacjami MVC.