Model-view-controller (MVC) (někdy také nesprávně označovaná jako Model-2) je softwarová architektura, která rozděluje datový model aplikace, uživatelské rozhraní a řídicí logiku do tří nezávislých komponent tak, že modifikace některé z nich má jen minimální vliv na ostatní.
MVC je často chápán jako návrhový vzor, nicméně se týká architektury aplikací mnohem více než klasický návrhový vzor. Tudíž může být užitečný pojem architektonický vzor (architectural pattern; Buschmann, et al 1996) nebo také agregační návrhový vzor (aggregate design pattern)[1].
Existuje také architektura Model 1, která odděluje pouze datový model od uživatelského rozhraní s řídicí logikou.
Obecně řečeno, vytváření aplikací s využitím architektury MVC vyžaduje vytvoření tří komponent, mezi které patří:
Model (model), což je doménově specifická reprezentace informací, s nimiž aplikace pracuje.
View (pohled), který převádí data reprezentovaná modelem do podoby vhodné k interaktivní prezentaci uživateli.
Controller (řadič), který reaguje na události (typicky pocházející od uživatele) a zajišťuje změny v modelu. Na základě těchto změn (a s možnou pomocí návrhového vzoru observer) se aktualizuje samotný pohled.[2]
Komponenty řadič a pohled jsou ve standardním rozdělení vrstev na prezentační, doménovou a datovou obvykle zařazovány jako prezentační vrstva. V MVC je tato prezentační vrstva rozdělena mezi komponenty řadič a pohled, nicméně nejdůležitější rozdělení je mezí prezentací a doménovou vrstvou.
Ačkoliv může být koncept MVC realizován různým způsobem, obecně platí tento princip:
Uživatel provede nějakou akci v uživatelském rozhraní (např. stiskne tlačítko).
Řadič obdrží oznámení o této akci z objektu uživatelského rozhraní.
Řadič přistoupí k modelu a v případě potřeby ho zaktualizuje na základě provedené uživatelské akce (např. zaktualizuje nákupní košík uživatele).
Model je pouze jiný název pro doménovou vrstvu. Doménová logika zpracuje změněná data (např. přepočítá celkovou cenu, daně a expediční poplatky pro položky v košíku). Některé aplikace užívají mechanizmus pro perzistentní uložení dat (např. databázi). To je však otázka vztahu mezi doménovou a datovou vrstvou, která není architekturou MVC pokryta.
Komponenta pohled použije zaktualizovaný model pro zobrazení zaktualizovaných dat uživateli (např. vypíše obsah košíku). Komponenta pohled získává data přímo z modelu, zatímco model nepotřebuje žádné informace o komponentě View (je na ní nezávislý). Nicméně je možné použít návrhový vzor pozorovatel, umožňující modelu informovat jakoukoliv komponentu o případných změnách dat. V tom případě se komponenta view zaregistruje u modelu jako příjemce těchto informací. Je důležité podotknout, že řadič nepředává doménové objekty (model) komponentě pohledu, nicméně jí může poslat příkaz, aby svůj obsah podle modelu zaktualizovala.
Samotnému konečnému zobrazení výsledku uživateli ještě může u web-aplikací předcházet odpověď ze serveru na klienta, aby si ihned vyžádal obnovení stránky (client side redirect, životnost 0, takže okamžitý): Tím je zaručeno, že při obnovení stránky uživatelem (refresh, F5 v prohlížeči) nevyvolá na serveru požadovanou akci opakovaně, ale že se jedná pouze o obnovení pohledu, nyní už bez požadavku na změnu dat (modelu). Účelem je změna URL a dat http requestu, aby poslední v řadě již nebyl "server-side data-affecting" (ovlivňující model), ale pouze "read-only" (pouhé zobrazení). Celý tento client-refresh (změna URL) se děje automaticky a bez povšimnutí uživatelem.
Uživatelské rozhraní čeká na další akci uživatele, která celý cyklus zahájí znovu.
Tento vzor poprvé popsalTrygve Reenskaug v roce 1979. Poprvé byl použit v jazyce Smalltalk, vyvíjeném v Xerox research labs. Touto implementací bylo inspirováno mnoho dalších projektů, např.:
NeXTSTEP a OPENSTEP, jejichž vývojová prostředí podporovala použití MVC;
Cocoa, založená na těchto technologiích, také používá MVC;
Microsoft Foundation Classes (MFC).
Občas je možné se setkat s tvrzením, že Swing (knihovna pro tvorbu grafického uživatelského rozhraní v Javě) také užívá MVC. To není pravda, neboť tato knihovna slučuje řadič a pohled do jedné komponenty a tudíž užívá jednodušší vzor Model 1.
V současné době se koncept MVC užívá především jako architektura webových aplikací. U složitějších aplikací je to způsob, jak zajistit jejich flexibilitu a spolehlivost i při častých změnách a jejich rychlém vývoji. Tento vzor bývá často pochopen nesprávně a mnoho aplikací tvrdí, že jej využívají, ačkoliv fakticky nesplňují základní požadavek, kterým je oddělení aplikační a prezentační logiky.
JavaServer Faces, Jakarta Struts a Webwork2 jsou momentálně nejpopulárnější rámce pro tvorbu webových aplikací, které využívají MVC. Struts pracuje na úrovni stránek, JSF na úrovni komponent (oba se ale nevylučují a je možné Struts i JSF použít zároveň).