一、設計模式簡介:

在學習MVC設計模式之前,先簡單說一下什麼是代碼的設計模式。

官方的說法是:

設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、代碼設計經驗的總結。設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。

 使用設計模式的目的:

爲了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編寫真正工程化。

那什麼是MVC設計模式呢?

MVC指的就是Model-View-Controller(模型-視圖-控制器)

模型:

Model制定業務邏輯,處理需求核心功能並且反饋處理後數據結果。

Model層返回的數據根據需求的不同有不同的可能,這樣一個Model能爲多個View提供數據。由於應用於Model的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重複性。

視圖:

View是用戶看到並與之交互的界面,負責處理界面的變化。

MVC一個大的好處是它能爲你的應用程序處理很多不同的視圖。在View中其實沒有真正的處理髮生業務,作爲視圖來講,它只是作爲一種輸出數據並允許用戶操縱的方式。

控制器:

Controller接受用戶的輸入並調用Model和View去完成用戶的需求。

Controller本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個Model構件去處理請求,然後用確定用哪個View來顯示Model處理返回的數據。

總結:

MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型返回的數據,並通過表示層呈現給用戶。

二、模型圖:

Java之MVC設計模式淺析


1、View 傳送指令到 Controller

2、Controller完成業務邏輯後,要求 Model 改變狀態

3、Model 將新的數據發送到 View,用戶得到反饋

三、案例講解:

控制檯提醒輸入一串字符串,輸入後,控制檯提示“1”和“2”功能選擇,分別對應以下需求:

(1)判斷該字符串中是否都是英文字母組成的,如果是則將所有字母轉成大寫,如果除了英文字母還有其他字符,那麼將其他字符輸出到控制檯上。

(2)判斷該字符串是否爲迴文字符串,如果是則控制檯輸出“合法字符串”,否則控制檯輸出“非法字符串”。

需求分析及代碼:

View:就本題而言,用戶在跟界面交互的過程中只有兩個功能,一是在控制檯顯示結果,一個就是獲取鍵盤錄入的數據。那麼View層的代碼爲:

/**
* 視圖類:用戶看到並與之交互的界面。
*
* @author jzc
*
*/
public class View {
static Scanner scanner = new Scanner(System.in);
/**
* 控制檯打印數據的方法
*
* @param data
* 需要打印的數據
*/
public static void consolePrint(String data) {
System.out.println(data);
}
/**
* 獲取鍵盤錄入的值
*
* @return 鍵盤錄入數據的字符串表現形式
*/
public static String getScannerData() {
String data = scanner.nextLine();
return data;
}
}

Model:此題有兩個需求,所以可以先確定Model層主要負責的核心邏輯有兩個,第一個是處理一個字符串數據,返回是純英文或者不是純英文字符串兩種情況之一的結果並讓View層顯示給客戶看。第二個同樣是處理一個字符串數據,返回是是否是迴文字符串的結果並讓View層顯示給客戶看。那麼Model層的代碼爲:

/**

* 模型類:業務規則和邏輯。此需求有兩個需求,分別是判斷字符串是否純英文,是則轉換大寫,不是則輸出非字母的其他字符。另外一個需求是判斷迴文。

* 
* @author jzc
*
*/
public class Model {
/**
* 判斷是否是英文字符串,是則小寫轉大寫。不是則輸出非字母字符。
*
* @param data
* 需要判斷的字符串
*/
public static void judgeEng(String data) {
if (data.matches("[a-zA-Z]{1,}")) {
View.consolePrint("該字符串都是英文");
data = data.toUpperCase();
} else {
View.consolePrint("該字符不全是英文");
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < data.length(); i++) {
char c = data.charAt(i);
if (!(c <= c="">= 'a') || (c <= c="">= 'A')) {
buffer.append(c);
}
}
data = buffer.toString();
}
// 得到結過後通知控制檯打印相應的結果
View.consolePrint("處理後的字符串爲:" + data);
}
/**
* 判斷是否是迴文字符串
*
* @param data
* 需要判斷的字符串
*/
public static void huiWen(String data) {
StringBuffer buffer = new StringBuffer(data);
String reverStr = buffer.reverse().toString();
if (reverStr.equals(data)) {
View.consolePrint("合法字符串");
}else {
View.consolePrint("非法字符串");
}
}
}

 Controller:根據題目的需求設定好調用的規則,調用Model完成需求,再根據數據的特點去調用相應的View層代碼進行界面顯示。那麼Controller層的代碼爲:

/**
* 控制器類:接受用戶的輸入並調用模型和視圖去完成用戶的需求。
*
* @author jzc
*
*/
public class Control {
// 利用字符串數組儲存已設定好的必須使用的字符串數據
static String[] datas = { "請輸入一串字符串:",
"請選擇要實現功能的序號:\n1、功能一 2、功能二 3、退出", "程序已退出..." };
public static void main(String[] args) {
function();
}
public static void function() {
while (true) {
View.consolePrint(datas[0]);
String string = View.getScannerData();
View.consolePrint(datas[1]);
int select = Integer.parseInt(View.getScannerData());
// 使用條件語句,根據用戶選擇的結果調用不同的功能
switch (select) {
case 1:
Model.judgeEng(string);
break;
case 2:
Model.huiWen(string);
break;
default:
View.consolePrint(datas[2]);
return;
}
}
}
}

四、MVC設計模式的優點:

1、多個視圖能共享一個模型。在MVC設計模式中,模型響應用戶請求並返回響應數據,視圖負責格式化數據並把它們呈現給用戶,業務邏輯層和表示層分離,同一個模型可以被不同的視圖重用,所以大大提高了代碼的可重用性。

2、由於MVC的三個模塊相對獨立,改變其中一個不會影響其他兩個,所以根據這種設計思想能夠構造良好的鬆耦合的構件。

五、MVC涉及模式的缺點:

MVC的缺點是要完全理解MVC並不是很容易。並且使用MVC需要很妥善的設計和思考。在一定程度上增加了工作量和代碼量。所以MVC並不適合小型甚至中等規模的應用程序,花費大量時間將MVC應用到規模並不是很大的應用程序通常會得不償失。

相關文章