**Projektēšanas šablons „Modelis-Skats-Kontrolieris"** (Model-View-Controller), tālāk tekstā — **MVC**, ir fundamentāls projektēšanas šablons, kas tiek lietots interaktīvās sistēmās (sistēmā, kur mijiedarbība starp lietotāju un sistēmu notiek dialogu režīmā, paredz lietotāja saskarni un iekļauj elementus, ar kuriem lietotājs manipulē ar sistēmu, un elementus, kas attēlo šo manipulāciju rezultātus). Loģiski sadalot lietojumprogrammu trīs patstāvīgās komponentēs, kur katrai komponentei ir savi uzdevumi un mērķi, lietojumprogramma kļūst vieglāk saprotama un pārvaldāma, kā arī tās komponentes ir iespējams atkārtoti izmantot.

Projektēšanas šablons MVC sadala sistēmu trijās daļās - datu ievads, datu apstrāde, datu attēlojums, kur katra daļa risina savu uzdevumu. 
Loģiskā komponente **Modelis** iekapsulē datu kodolu un pamatfunkcionalitāti, kas nav atkarīga no attēlojuma.   
Loģiskā komponente **Skats** ir atbildīga par **Modeļa** datu attēlošanu, atbilstoši lietotāja definētai datu prezentācijas formai. (Prezentāciju formu nosaka, piemēram, lietotāja saskarnes valoda vai lietotāja piekļuves līmenis). Loģiskā komponente **Kontrolleris** saņem un nolemj kā apstrādāt ziņojumus, kurus saņem no lietotāja, un translē signālus komandās, kas tiek sūtītas **Modelim** vai **Skatam**.   
 MVC mērķis ir padarīt Modeli neatkarīgu no Skata un Kontrollera, kuri kopā veido lietotāja saskarni lietojumprogrammā. Tāda neatkarība ļauj izstrādāt un testēt modeli neatkarīgi no tā attēlojuma. Tā kā Modelis ir neatkarīgs, tas nevar tieši griezties pie Skata vai Kontrollera.   
Modelis var pasīvi piegādāt servisus un datus citām lietojumprogrammas komponentēm, vai arī paziņot citām komponentēm par sava stāvokļa izmaiņām.

MVC struktūra
-------------

Komponente Modelis realizē programmas funkcionalitāti (piem. izpilda aritmētiskas operācijas, griežas pie datu avota, lai nolasītu vai saglabātu neaktīvus objektus). MVC šablons paredz to, ka komponente, kas atbild par datu attēlošanu lietotājam (Skats), attēlo notikušās izmaiņas Modeļa stāvokli. Lai to realizētu MVC paredz notifikācijas mehānismu. Modelis var piereģistrēt vienu vai vairākus Skatus vai Kontrollerus kā savus novērotājus un paziņot tiem par notikušam izmaiņām. Attēlā ir redzama klasiska MVC klašu diagramma. Modelis satur Novērotāju kolekciju. Gan Skats, gan Kontrolleris ir abstrakti novērotāji.

MVC dalībnieki
--------------

### Modelis

Komponente Modelis satur klases un saskarnes, kas atbalsta datu modeli. Modeļa stāvoklis iekapsulēts atribūtos un metožu implementācijās.
Modeļa kods nesatur informāciju, kas attiecas uz saskarni, tomēr izsūta Skatam notifikācijas par jebkurām izmaiņām Modeļa stāvoklī. Pastāv divas modeļa variācijas – Pasīvais un Aktīvais Modelis.

#### Pasīvais Modelis

Pasīvajā Modelī objekti, kas atrodas Modelī, nezina, ka tie tiek izmantoti MVC triādē. Kontrolleris nosūta notifikāciju Skatam tad, kad Kontrolleris palaiž tādu operāciju Modelī, kurai nepieciešama Skata atjaunošana. Šāda pieeja ir raksturīga tīmekļa lietojumprogrammām.
MVC šablons ar pasīvo modeli neparedz notifikācijas mehānismu no Modeļa puses. Skats un Kontrolleris nereģistrē sevi kā Novērotājus. Tādējādi, par notifikāciju atbild Kontrolleris, kas paziņo Skatam, ka izsauktās funkcijas izmainīja Modeļa stāvokli. MVC šablons ar pasīvo Modeli tiek izmantots tīmekļa lietojumprogrammās. Attēlotajā secības diagrammā ir redzams, kā Kontrolleris nosūta notifikāciju Skatam par izmaiņām Modelī. Modelis pasīvi atgriež vērtības, ko pieprasa Skats vai Kontrolleris.

#### Aktīvais Modelis

Aktīvā Modeļa klases nosaka izmaiņu notifikācijas mehānismu, kas atļauj paziņot neatkarīgām komponentēm, Skatam un Kontrollerim, par izmaiņām Modelī. Parasti tam tiek izmantots projektēšanas šablons Novērotājs (Observer). Notifikācijas mehānisms nekāda mērā nepadara Modeli atkarīgu. MVC šablons ar aktīvo Modeli tiek izmantots darbvirsmas lietojumprogrammās. Attēlotajā secības diagrammā ir redzams, kā Modelis nosūta notifikāciju Skatam par izmaiņām Modelī.

### Skats

Komponente Skats satur klases un saskarnes, kas nodrošina modeļa vizuālo attēlojumu. Skatu var nosaukt par Modeļa stāvokļa reprezentāciju, kas tikai lasa datus no Modeļa izmantojot Modeļa klases metodes. Skatam ir brīva pieeja pie Modeļa, bet Skats nevar mainīt Modeļa stāvokli.

### Kontrolleris

Komponente Kontrolleris saņem no lietotāja signālus un translē tos pieprasījumos Modelim vai Skatam, kuri liek Modelim vai Skatam mainīties un atbildēt par veiktajām izmaiņām Kontrollerim. Aktīvā Modeļa gadījumā Modeļa stāvokļa izmaiņas izmaina arī Skatu — par to ir atbildīgs Modelis. Pasīvā Modeļa gadījumā par Skata notifikāciju atbild Kontrolleris.

Attiecības
----------

### Modelis-Skats

MVC šablonā Skats ir atdalīts no Modeļa, nodibinot mijiedarbības protokolu Izdevējs-Parakstītājs (Publisher-Subscriber), plašāk pazīstams kā Noverotājs (Observer). Attiecības starp Modeli un Skatu tiek definētas kā, attiecīgi, Subjekta (Subject) un Novērotāja (Observer) attiecības projektēšanas šablonā Novērotājs. 

### Skats-Kontrolleris

SmallTalk valodā Skats un Kontrolleris ir ļoti saistīti. Katrs Skata eksemplārs ir saistīts ar unikālu Kontrollera eksemplāru. Skats ir atbildīgs par jaunu Skatu un Kontrolleru izveidošanu. Dažās uz MVC bāzētās grafiskās lietotāja saskarnes realizācijās Skats un Kontrolleris ir vienkārši apvienoti vienā objektā. Attiecības starp Skatu un Kontrolleri varētu būt definētas kā Stratēģija (Strategy) projektēšanas šablons.

### Kontrolleris-Modelis

Attiecības starp Modeli un Kontrolleri tiek definētas, izmantojot projektēšanas šablonu Komanda (Command).

Ārējās saites
-------------

* Триада MVC в действии
* MVC для начинающих