Model-view-controller-model
Model-view-controller (of MVC) is een ontwerppatroon ("design pattern") dat het ontwerp van complexe toepassingen opdeelt in drie eenheden met verschillende verantwoordelijkheden: datamodel (model), datapresentatie (view) en applicatielogica (controller).
Het scheiden van deze verantwoordelijkheden bevordert de leesbaarheid en herbruikbaarheid van code. Het maakt ook dat bijvoorbeeld veranderingen in de gebruikersinterface niet direct invloed hebben op het datamodel en vice versa. MVC werd voor het eerst gebruikt in de eerste implementaties van Smalltalk.

Patroonomschrijving 
Model
 Definieert de representatie van de informatie waarmee de applicatie werkt. Aan ruwe gegevens wordt betekenis gegeven door relaties tussen data en logica toe te voegen. De daadwerkelijke opslag van data wordt gedaan met behulp van een persistent opslagmedium, zoals een database. De applicatie zal gegevens die gebruikt worden in het model, ophalen en wegschrijven van en naar de dataopslag via een datalaag. De datalaag is niet per se een onderdeel van het MVC-patroon.

View
 Informatie wordt weergegeven via de View. Userinterface-elementen zullen gedefinieerd zijn in dit onderdeel. De view doet geen verwerking (zoals berekeningen, controles,...) van de gegevens die getoond worden.

Controller
 De controller verwerkt en reageert op events, die meestal het gevolg zijn van handelingen van de gebruiker.

Werking 
Naast het opsplitsen van de logica in verschillende klassen, ligt een ingewikkelde wisselwerking van boodschappen tussen objecten van deze klassen aan de basis van het patroon. Het komt erop neer dat iedere view die aangepast moet worden bij veranderingen in het model, dit aan het model mededeelt door zich te registreren bij het model. Het model houdt aldus een lijst bij van alle views die geregistreerd zijn. Bij aanpassingen van het model zal het model zichzelf updaten door de lijst van views af te wandelen en aan elke view te melden dat er een verandering heeft plaatsgevonden. Waarop elke view aan het model 'vraagt' wat er is veranderd en dan zelf besluit om zich aan te passen of niet.

De gebruiker heeft contact met de view. De view geeft (nieuwe of aangepaste) gegevens door naar de controller. De controller verwerkt de gegevens. De verwerkte gegevens worden doorgegeven aan het model. Het wordt afgeraden om de view rechtstreeks te koppelen aan het model.

Zichtbaarheid 
De controller kent de view en het model.
De view kent het model.
Het model heeft geen weet van eventuele views, wat het uitbreiden van de applicatie makkelijker maakt.

Voordelen 
Het grote voordeel van het patroon is dat er heel gemakkelijk nieuwe soorten views toegevoegd kunnen worden zonder het model aan te passen. Zo was het in 1994 reeds mogelijk om in Smalltalk te programmeren via een web-interface. Smalltalk implementeerde daartoe gewoon een html-view op zichzelf.
Het resultaat was VisualWave, een webversie van VisualWorks (de naam van het Smalltalk-systeem). Dit was mogelijk door het feit dat de hele Smalltalk-ontwikkelingsomgeving volledig volgens het MVC-patroon was geschreven.

Implementaties 
Voor Java bestaan veel MVC-frameworks. Bekende zijn Struts, JavaFX en Spring.
Het MVC-framework voor Ruby is Ruby on Rails. Voor Python is Django het bekendste MVC-framework. Bekende MVC-frameworks voor PHP zijn Zend Framework, CodeIgniter, Kohana, Laravel, CakePHP en Phalcon.
Voor Microsoft .NET zijn er MonoRail, Vici MVC en een native .NET-implementatie, genaamd Microsoft ASP.NET MVC. Voor Adobe ColdFusion zijn er onder andere Mach-II, Model-Glue en ColdBox. Voor Perl is er het framework Catalyst.

Zie ook 
 Ontwerppatroon
 Multitierarchitectuur
 View model

Ontwerppatroon