Java之MVC设计模式浅析

一、设计模式简介:
在学习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张图片

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应用到规模并不是很大的应用程序通常会得不偿失。

你可能感兴趣的:(Java之MVC设计模式浅析)