Java之MVC设计模式浅析

发表于:2017-7-14 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Madcola    来源:博客

  一、设计模式简介:
  在学习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应用到规模并不是很大的应用程序通常会得不偿失。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号