Kontroler widoku modelu (MVC) to rodzaj architektury oprogramowania i wzorca projektowego, który dzieli każdy element programu na dobrze zdefiniowane obszary funkcjonalności. W architekturze model-widok-kontroler model zajmuje się całą wewnętrzną logiką programu, która manipuluje, zapisuje, pobiera oraz w inny sposób obsługuje i oblicza dane. Aspekt widoku odpowiada za wyświetlanie użytkownikowi informacji z modelu, a także umożliwia użytkownikowi wprowadzenie danych wejściowych do programu. Kontroler pobiera dane wejściowe z widoku, ocenia je lub w inny sposób przetwarza i wchodzi w interakcję z modelem, aby zmienić dane lub stan programu, który ostatecznie jest pokazywany użytkownikowi za pośrednictwem widoku. Chociaż projekt modelu-przeglądarki-kontrolera wymaga programu, który zawierałby funkcjonalność, te trzy sekcje nadal muszą w jakiś sposób ze sobą współdziałać i generalnie są w pewnym sensie od siebie zależne, w przeciwieństwie do innych bardziej agresywnych wzorców projektowych.
Dość często wzorzec model-widok-kontroler jest widoczny w aplikacjach, które zarządzają graficznym interfejsem użytkownika (GUI). Korzystając ze wzorca MVC, różne elementy wizualne GUI są obsługiwane przez widok, rejestrowanie i przetwarzanie miejsca i tego, co klika użytkownik, jest obsługiwane przez kontroler, a faktycznie zmiana informacji lub ładowanie informacji jest wykonywane przez model. W zależności od dokładnego projektu aplikacji, każdy składnik wzorca MVC może mieć mechanizm interakcji z innymi składnikami, takimi jak model będący w stanie bezpośrednio poinstruować widok, aby odświeżył ekran lub widok mający sposób na poinformowanie kontroler, że odświeża ekran i nie przyjmuje nowych danych wejściowych. W przeciwieństwie do niektórych wzorców projektowych, które przyjmują ścisłe podejście czarnoskrzynkowe, programy typu model-widok-kontroler wydają się być nieco bardziej elastyczne, chociaż niektóre implementacje mogą utrudnić modułową zmianę lub debugowanie programu MVC.
W niektórych przypadkach wzorzec model-widok-kontroler nie musi zawierać tylko jednego z każdego komponentu. Jednym z przykładów jest aplikacja, która ma wiele widoków, na przykład wiele monitorów, lub wyświetlacz, który można zobaczyć na kilku urządzeniach klienckich. Wiele widoków i kontrolerów może być używanych w aplikacji, która umożliwia wielu użytkownikom dostęp do bazy danych, a wszystkie odpowiadają jednemu modelowi. Częściej jednak projektuje się systemy, które zachowują stosunek jeden do jednego między komponentami model-widok-kontroler.
Mimo że komponenty model-widok-kontroler są od siebie zależne, może być znacznie łatwiej modyfikować pewne części systemu, które używają wzorca MVC, niż gdyby w ogóle nie stosowano żadnego wzorca, szczególnie w przypadku nie zorientowanego obiektowo Aplikacje. Jeśli aplikacja używa wywołań zwrotnych lub odbiorników i obserwatorów do implementacji interakcji między komponentami, każdy komponent może zostać zmieniony bez wpływu na pozostałe dwa. Oznacza to, że można zaimplementować nowy GUI bez wpływu na model lub kontroler. Należy jednak zauważyć, że fundamentalne zmiany w systemie model-widok-kontroler mogą wymagać niewielkiej ilości ponownego kodowania dla każdego pojedynczego komponentu.