דיאגרמה פשוטה המתארת את היחסים בין המודל, התצוגה והבקר. הקווים הרצופים מתארים קשר ישיר, והקווים המנוקדים מתארים קשר עקיף (דהיינו, באמצעות תבנית העיצוב Observer).
תבנית Model-View-Controller (בקיצור MVC, בתרגום חופשי: תבנית מודל-תצוגה-בקר) היא תבנית עיצוב בהנדסת תוכנה המשמשת להפשטת יישום כלשהו. התבנית מתארת טכניקה לחלוקת היישום לשלושה חלקים: "מודל", "תצוגה" ו"בקר", המחוברים ביניהם בצימוד רפוי מונחה אירועים. בדרך זו, התלות ההדדית בין ממשק המשתמש לשאר חלקי התוכנה פוחתת, ואת החלקים השונים ניתן לפתח באופן בלתי-תלוי. בנוסף, קל יותר לתחזק את התוכנה וכן לעשות שימוש חוזר בחלקי היישום שהופרדו.
MVC, בדומה לתבניות עיצוב רבות אחרות, תוארה לראשונה בשפת התכנותSmalltalk. התבנית תוארה לראשונה בשנת 1979 על ידי טרִיגְב רִינְסקַאוּג, אז עובד במעבדות המחקר של חברת זירוקס. היישום המקורי מתואר בהרחבה במאמר המשפיע שכתב סטיב ברובק[1].
מקובל לחלק יישום תוכנה למספר שכבות נפרדות: שכבת התצוגה (ממשק משתמש), שכבת התחום העסקי (לעיתים נקראת גם "שכבת הלוגיקה העסקית") ושכבת הגישה לנתונים. בתבנית MVC, שכבת התצוגה מחולקת בנוסף ל"תצוגה" ו"בקר". יש המחשיבים את התבנית כתבנית עיצוב, אך בהשוואה לתבניות עיצוב אחרות, MVC עוסקת במבנים בקנה מידה בינוני-גדול ולכן נחשבת גם כתבנית ארכיטקטורה.
מודל
המודל הוא יצוג מסוים, מוכוון תחום עסקי, של המידע עליו פועל היישום. המודל, למרות הדעה הרווחת, אינו שם אחר לשכבת התחום העסקי והוא נפרד ממנה. תבנית MVC אינה מזכירה במפורש את שכבת הגישה לנתונים, מכיוון ששכבה זו היא מתחת למודל, או נעטפת על ידו.
תצוגה
תפקידה להמיר את נתוני המודל לייצוג המאפשר למשתמש לבצע פעולת גומלין כלשהי. לרוב מדובר על המרה לממשק משתמש כלשהו. תבנית MVC משמשת רבות ביישומי Web, בהם התצוגה היא דף HTML והקוד האוסף מידע דינמי לדף.
בקר
תפקידו לעבד ולהגיב לאירועים המתרחשים בתצוגה, לרוב, כתגובה לפעולה של המשתמש. בעיבוד האירועים, הבקר עשוי לשנות את המידע במודל, באמצעות שפעול שירותים המוגדרים בו. בקרים מורכבים מתבססים לרוב על יישום של תבנית Command.
ניתן ליישם את תבנית העיצוב MVC בדרכים רבות, אך לרוב היא מיושמת כך:
הבקר נרשם כ-Event Handler או Callback בתצוגה, בדרך כלל סמוך ליצירת הבקר. כלומר, יישום של שיטת היפוך הפיקוח (IoC). משמע, הבקר יקבל פיקוח כאשר יתרחש אירוע קלט בממשק המשתמש.
ביצוע פעולת גומלין עם הממשק. לדוגמה, לחיצה על כפתור "הוספת מוצר לסל הקניות".
הבקר שנרשם על התצוגה מקבל פיקוח ומשפעל שירותים המוגדרים במודל, כדי לשקף את הפעולה שבוצעה. לדוגמה, עדכון עגלת הקניות בפריט שנוסף.
התצוגה מקבלת בצורה עקיפה את חוכמת התצוגה שלה מהבקר, בדרך כלל באמצעות יישום של תבנית Strategy.
התצוגה משתמשת במודל כדי ליצור את ממשק המשתמש. לדוגמה, התצוגה מפיקה רשימה של הפריטים בעגלה, כפי שאלה מיוצגים כרגע במודל. בין השניים אין קשר הדוק, והמודל אינו מודע לכך שהתצוגה ניגשת למידע המאוחסן בו.
לעיתים, המודל עשוי להודיע על שינויים המתחוללים בו לצדדים שלישיים נוספים, בדרך כלל באמצעות יישום של תבנית Observer.
ממשק המשתמש ממתין לפעולות נוספות של המשתמש, וכשאלה מתרחשות, התהליך חוזר על עצמו.
תבנית MVC השפיעה רבות על התכנון של ממשקי משתמש חלונאים רבים, החל מימי Smalltalk ועד ליישומי Web. עשרות מימושים של MVC זמינים לרוב פלטפורמות המחשוב וממשקי המשתמש העיקריים.