一、设计模式简介:
在学习MVC设计模式之前,先简单说一下什么是代码的设计模式。
官方的说法是:
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。设计模式是软件工程的基石脉络,如同大厦的结构一样。
使用设计模式的目的:
为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化。
那什么是MVC设计模式呢?
MVC指的就是Model-View-Controller(模型-视图-控制器)
模型:
Model制定业务逻辑,处理需求核心功能并且反馈处理后数据结果。
Model层返回的数据根据需求的不同有不同的可能,这样一个Model能为多个View提供数据。由于应用于Model的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
视图:
View是用户看到并与之交互的界面,负责处理界面的变化。
MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在View中其实没有真正的处理发生业务,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
控制器:
Controller接受用户的输入并调用Model和View去完成用户的需求。
Controller本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个Model构件去处理请求,然后用确定用哪个View来显示Model处理返回的数据。
总结:
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 <= 'z' && c >= 'a') || (c <= 'Z' && 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应用到规模并不是很大的应用程序通常会得不偿失。
网友评论