รูปแบบ MVC เป็นการแยกการทำงานของโปรแกรมออกเป็น 3 ส่วนตามหน้าที่ของมันคือ (1) ส่วนจัดการข้อมูล (model) : จะเป็นส่วนที่เป็นตรรกะของการทำงาน การจัดการและจัดเตรียมข้อมูล การควบคุมและนำเสนอข้อมูล (2) ส่วนแสดงผล (View) : เป็นส่วนติดต่อกับผู้ใช้งานและแสดงผลข้อมูลในรูปแบบที่ผู้ใช้งานต้องการ (3) ส่วนควบคุม (Controller) : เป็นตัวกลางในการเชื่อมต่อระหว่างส่วนจัดการข้อมูลและส่วนแสดงผล โดยจะรับการเปลี่ยนแปลงจากส่วนแสดงผลไปบอกกับส่วนจัดการข้อมูล การแยกส่วนดังกล่าวช่วยให้การทำงานง่ายขึ้นเพราะผู้ดูแลส่วนติดต่อผู้ใช้งานกับส่วนจัดการข้อมูลจะเป็นคนละกลุ่มกัน วิธีการทดสอบของทั้ง 2 ส่วนก็แตกต่างกัน ส่วนติดต่อผู้ใช้งานมักจะเป็นส่วนที่ถูกแก้ไขบ่อยที่สุด การแยกส่วนทำให้การแก้ไขไม่กระทบกับส่วนอื่น และบ่อยครั้งที่ส่วนติดต่อผู้ใช้งานจะใช้ส่วนจัดการข้อมูลเดียวกัน เช่น การแบ่งการแสดงผลออกเป็นกราฟ เป็นตาราง หรือ เป็นวิดเจ็ต เป็นต้น รูปแบบ MVC ช่วยให้เราพัฒนาโปรแกรมแบบโมดูลาร์ บำรุงรักษา และปรับขนาดได้ ด้วยการแยกข้อกังวลของโปรแกรมออกเป็นส่วนประกอบที่แตกต่างกัน ซึ่งแต่ละส่วนสามารถพัฒนา ทดสอบ และบำรุงรักษาโดยอิสระจากส่วนอื่นๆ ซึ่งช่วยให้สามารถแก้ไขและปรับปรุงแอปพลิเคชันได้ง่ายขึ้นเมื่อเวลาผ่านไป ทำให้สามารถปรับให้เข้ากับความต้องการทางธุรกิจที่เปลี่ยนแปลงได้มากขึ้นและง่ายขึ้น
ส่วนจัดการข้อมูล (model) จะประกอบด้วยออบเจกต์จำนวนมากมายขึ้นอยู่กับว่าโปรแกรมของเราใหญ่ขนาดไหน ส่วนจัดการข้อมูลมีหน้าที่ในการจัดการข้อมูลตามตรรกะที่กำหนดไว้ ตรวจสอบว่าข้อมูลถูกต้อง และจัดเก็บข้อมูล เช่น บันทึกลงในฐานข้อมูล หรือสื่อบันทึกข้อมูล แต่จะไม่ครอบคลุมถึงการแสดงข้อมูลในแบบที่ผู้ใช้งานต้องการจะเห็น การแยกส่วนการจัดการข้อมูลออกมาแบบนี้ทำให้ไม่เกิดการผูกพันในการนำไปใช้งาน ทำให้ส่วนจัดการข้อมูลเดียวกันสามารถถูกใช้กับส่วนแสดงผลข้อมูลได้หลายแบบแตกต่างกันไป เช่น แสดงผ่านโปรแกรม แสดงผ่านเว็บ แสดงผ่านมือถือ แสดงเป็นกราฟ แสดงเป็นรายการ แสดงเป็นตารางคำนวน เป็นต้น การทำงานระหว่างส่วนจัดการข้อมูลและส่วนแสดงผลจะเป็นไปตามรูปแบบ observer ดังนั้นการนำโปรแกรมในส่วนจัดการข้อมูลมาใช้ใหม่จึงทำได้ง่ายมาก
ส่วนแสดงผล (view) จะทำหน้าที่เอาข้อมูลจากส่วนแสดงผลมาแสดงในรูปแบบต่างๆ ตามที่การทำงานระหว่างส่วนจัดการข้อมูลและส่วนแสดงผลจะเป็นไปตามรูปแบบ observer ส่วนจัดการข้อมูลจะเป็นส่วนที่เป็นออบเจกต์หลัก (subject) และส่วนแสดงผลจะเป็นส่วนที่เป็นออบเจกต์เฝ้าสังเกตุ (observer) โดยการทำงาน คือ เมื่อส่วนจัดการข้อมูลมีการเปลี่ยนแปลงก็จะแจ้งมายังส่วนแสดงผลว่ามีเหตุการณ์เกิดขึ้น ส่วนแสดงผลก็จะถามกลับไปยังส่วนจัดการข้อมูลถึงรายละเอียดของการเปลี่ยนแปลงแล้วนำข้อมูลไปปรับปรุงการแสดงผลต่อไป เนื่องจากส่วนจัดการข้อมูลเดียวกันสามารถถูกใช้กับส่วนแสดงผลข้อมูลได้หลายแบบ ดังนั้นส่วนจัดการข้อมูลจะแจ้งมายังส่วนแสดงผลทุกอันที่เกี่ยวข้อง และส่วนแสดงผลแต่ละอันก็สอบถามและนำข้อมูลไปปรับปรุงการแสดงผลของตนเอง
ส่วนควบคุม (controller) จะผูกพันกับส่วนแสดงผลที่เกี่ยวข้องและทำหน้าที่ในการตอบสนองต่อการเปลี่ยนแปลงของส่วนแสดงผล โดยการแจ้งการปรับปรุงไปยังส่วนจัดการข้อมูล ดังนั้นส่วนควบคุมจะประกอบไปด้วยตรรกะการทำงานในส่วนที่ตอบสนองต่อการกระทำของผู้ใช้งาน
ตัวอย่างขั้นตอนการทำงานของรูปแบบ mvc เริ่มจากผู้ใช้งานกดปุ่มในส่วนแสดงผล ซึ่งจะไปเรียกเมธอดในส่วนควบคุม ด้วยตรรกะการทำงานที่กำหนดไว้ส่วนควบคุมก็จะไปเรียกเมธอดในส่วนจัดการข้อมูลตามที่กำหนด เมื่อส่วนจัดการข้อมูลดำเนินการตามที่กำหนดแล้วจะแจ้งไปยังทุกๆส่วนแสดงผลที่เกี่ยวข้องว่ามีการเปลี่ยนแปลง เมื่อส่วนแสดงผลได้รับการแจ้งจากส่วนจัดการข้อมูลก็จะติดต่อไปยังส่วนจัดการข้อมูลเพื่อสอบถามสถานะที่เปลี่ยนไปเพื่อเอามาปรับปรุงการแสดงผล
ข้อควรระวังในการใช้รูปแบบ mvc คือทั้ง 3 ส่วนต่างผูกพันกันดังนั้นในการออกแบบต้องระมัดระวังให้การผูกพันกันน้อยที่สุดเท่าที่จะทำได้ นอกจากนี้การเพิ่มฟังก์ชั่นต่างๆต้องแน่ใจว่าเราเพิ่มไปที่ส่วนควบคุมแทนที่จะเป็นส่วนแสดงผล เพื่อความง่ายในการทดสอบ และเพื่อให้ส่วนแสดงผลเบาและง่ายต่อการนำกลับมาใช้ใหม่ รูปแบบ mvc อาจจะไม่เหมาะกับบางเรื่อง เช่น การสร้างเกมส์ด้วยเหตุผลทางด้านประสิทธิภาพ และไม่เหมาะกับโปรแกรมขนาดเล็กเพราะจะทำให้โปรแกรมซับซ้อนโดยไม่จำเป็น
ตัวอย่างด้านล่างเป็นการใช้รูปแบบ mvc ในภาษาจาวา สังเกตุส่วนจัดการข้อมูลจะยุ่งกับเรื่องข้อมูลเท่านั้น
Model
public class Model {
private String data;
public void setData(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
การเชื่อมโยงส่วนแสดงผลกับส่วนควบคุม ใช้ฟิลด์ controller เพื่อออบเจกต์ของส่วนควบคุมที่ใช้ และเรียกใช้เมธอด setData() ของออบเจกต์ Controller เพื่อส่งค่าผ่านส่วนควบคุมไปดำเนินการต่อ
View
import java.util.Scanner;
public class View {
private Controller controller;
public void setController(Controller controller) {
this.controller = controller;
}
public void showData(String data) {
System.out.println(“Data received: ” + data);
}
public void getInput() {
Scanner scanner = new Scanner(System.in);
System.out.print(“Enter data: “);
String data = scanner.nextLine();
controller.setData(data);
}
}
ในส่วนควบคุมจะมีฟิลด์ model และ view เพื่อเก็บออบเจกต์ส่วนจัดการข้อมูลและส่วนแสดงผลที่เชื่อมกันด้วยออบเจกต์ส่วนควบคุมนี้ และเรียกใช้เมธอด setController ของออบเจกต์ View เพื่อกำหนดส่วนควบคุมให้กับออบเจกต์ของ View เมื่อมีการเรียกใช้มาจากออบเจกต์ View ผ่านเมธอด setData() ข้อมูลจะถูกส่งให้ออบเจกต์ Model ไปดำเนินการต่อ
Controller
public class Controller {
private Model model;
private View view;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
this.view.setController(this);
}
public void setData(String data) {
model.setData(data);
view.showData(data);
}
public void getInput() {
view.getInput();
}
}
ในการเรียกใช้งานเราต้องสร้างออบเจกต์ของ mvc ขึ้นมา
Main.java
public class Main {
public static void main(String[] args) {
Model model = new Model();
View view = new View();
Controller controller = new Controller(model, view);
view.getInput();
}
}