MVC概述
整體概覽
整個(gè)mvc的工作流程可以看作下圖:
簡(jiǎn)單的用例圖如下:
Model(模型)
Model用于封裝與應(yīng)用程序業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對(duì)數(shù)據(jù)進(jìn)行處理的相關(guān)方法
例如:學(xué)生這個(gè)實(shí)體類,以及類方法蜗帜。學(xué)生的數(shù)據(jù)我可以從數(shù)據(jù)庫(kù)或者其他方式中獲得速警,并且我可以在學(xué)生類中對(duì)數(shù)據(jù)進(jìn)行處理,比如setter和getter方法。
比如下面的學(xué)生類:
package com.example;
// Model
public class Student {
private String rollNo;
private String name;
public String getRollNo() {
return rollNo;
}
public String getName() {
return name;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public void setName(String name) {
this.name = name;
}
}
Model有對(duì)數(shù)據(jù)庫(kù)直接的訪問權(quán)力。
Model不依賴View和Controller,即Model不關(guān)心數(shù)據(jù)如何被顯示以及如何被操作堤瘤。但是 Model 中數(shù)據(jù)的變化一般會(huì)通過一種刷新機(jī)制被公布。為了實(shí)現(xiàn)這種機(jī)制浆熔,那些用于監(jiān)視此 Model 的 View 必須事先在此 Model 上注冊(cè)本辐,從而,View 可以了解在數(shù)據(jù) Model 上發(fā)生的改變。
視圖(View)
能夠?qū)崿F(xiàn)數(shù)據(jù)有目的的顯示,在 View 中一般沒有程序上的邏輯慎皱。為了實(shí)現(xiàn) View 上的刷新功能老虫,View 需要訪問它監(jiān)視的數(shù)據(jù)模型(Model),因此應(yīng)該事先在被它監(jiān)視的數(shù)據(jù)那里注冊(cè)茫多。
還是以學(xué)生為例祈匙,僅僅通過View層來顯示學(xué)生的相關(guān)數(shù)據(jù)
package com.example;
//View
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo){
System.out.println("Student:");
System.out.println("name:" + studentName);
System.out.println("RollNo:" + studentRollNo);
}
}
控制器(Controller)
起到不同層面間的組織作用,用于控制應(yīng)用程序的流程地梨。它處理事件并作出響應(yīng)菊卷〉蘅遥“事件”包括用戶的行為和數(shù)據(jù) Model 上的改變宝剖。
可以看出Controller層將Model和View層聯(lián)系起來,View層監(jiān)視Model層數(shù)據(jù)的改變歉甚,監(jiān)視的方法就是通過Controller層的相關(guān)操作來實(shí)現(xiàn)万细,比如下面代碼的updateView()函數(shù),這個(gè)函數(shù)通過調(diào)用Controller層的相關(guān)函數(shù)來對(duì)View層的數(shù)據(jù)展示進(jìn)行更新纸泄。
package com.example;
// Controller
public class StudentController {
private Student model;
private StudentView view;
public StudentController(Student model,StudentView view){
this.model = model;
this.view = view;
}
public void setStudentName(String name){
model.setName(name);
}
public String getStudentName(){
return model.getName();
}
public void setStudentRollNo(String rollNo){
model.setRollNo(rollNo);
}
public String getStudentRollNo(){
return model.getRollNo();
}
//通過調(diào)用Controller的getStudentName()和getStudentRollNo()來更新View層的數(shù)據(jù)
public void updateView(){
view.printStudentDetails(getStudentName(),getStudentRollNo());
}
}
Demo演示
下面的Demo演示了MVC中是如何工作的
model獲取數(shù)據(jù)庫(kù)的數(shù)據(jù)赖钞,創(chuàng)建視圖,通過controller結(jié)合model和view聘裁,通過controller中的方法將model中存放的數(shù)據(jù)顯示在view層雪营。
package com.example;
public class MVCPatternDemo {
public static void main(String[] args) {
//從數(shù)據(jù)庫(kù)獲取學(xué)生信息
Student model = retiveStudentFromDB();
//創(chuàng)建視圖,把學(xué)生信息輸出到控制臺(tái)
StudentView view = new StudentView();
StudentController studentController = new StudentController(model,view);
studentController.updateView();
//更新模型數(shù)據(jù)
model.setName("xm");
model.setRollNo("1721");
System.out.println("更新數(shù)據(jù)...");
studentController.updateView();
}
//模擬從數(shù)據(jù)庫(kù)中獲得數(shù)據(jù)
private static Student retiveStudentFromDB(){
Student student = new Student();
student.setName("xjz");
student.setRollNo("1720");
return student;
}
}
參考資料:
菜鳥教程-MVC模式