W typowej aplikacji możemy wyróżnić zawsze trzy główne rodzaje aktywności: struktury danych, algorytmy przetwarzania oraz kanały komunikacyjne, które reprezentują określony problem lub dziedzinę rzeczywistości, komponenty do prezentacji danych oraz obsługę danych wejściowych z klawiatury i myszki, czyli reagowanie na poczynania użytkownika. W dla każdego z nich jest jawnie wydzielana osobna część, która komunikuje się z pozostałymi: model do reprezentowania danych przetwarzanych w programie, widok do generowania wyjścia i prezentowania wyników oraz kontroler do obsługi wejścia. Istotne jest, że każda z części ma wyłączność na zarządzanie swoją częścią procesu – przykładowo nie może dojść do sytuacji, w której kod odpowiedzialny za wyświetlanie graficznego interfejsu użytkownika znajdzie się w modelu bądź kontrolerze.

Komunikacja między widokiem a kontrolerem jest łatwa do opisania, ponieważ oba te komponenty są stworzone do pracy ze sobą, jednak model musi komunikować się z nimi w sposób niejawny.