MVC模式详解(优缺点及模式组成示例)

MVC模式详解(优缺点及模式组成示例)-mikechen

MVC模式简介

MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基本的部分。

分别为:

  • 模型Model
  • 视图View
  • 控制器Controller

主要为以上三大部分组成,如下图所示:

MVC模式详解(优缺点及模式组成示例)-mikechen

 

MVC模式优缺点

1.MVC模式优点

1)多个视图共享一个模型,大大提高代码的可重用性;

2)三个模块相互独立,改变其中一个不会影响其他两,所以依据这种设计模式,能构建良好的松耦合性的组件;

3)控制器提高了应用程序的灵活性和可控制性:控制器可以用来连接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提高强有力的手段。

 

2.MVC模式缺点

1)增加了系统结构和实现的复杂性

对于简单页面,严格遵循mvc,会增加结构的复杂性。

2)视图与控制器过于紧密的连接

视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的。

3)视图对模型数据的低效率访问

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据,对未变化数据的不必要的频繁访问,也将损害操作性能。

 

MVC模式模型

MVC模式详解(优缺点及模式组成示例)-mikechen

1.模型(Model)

模型封装了数据及对数据的操作,可以直接对数据库进行访问。

简要的讲:就是一个或多个javabean对象,用于存储数据和业务逻辑。

 

2.视图(View)

视图负责展示,没有具体的程序逻辑,比如:一个JSP页面想控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean标记来显示数据。

 

3.控制器(Controller)

控制器用于控制程序的流程,将模型中的数据展示到视图中。

比如:Servlet对象根据视图提交的请求进行控制,即将请求转发给业务逻辑的javabean,并将处理记过存放到实体模型javabean中,输出给视图显示。

 

MVC模式示例

1.创建模型

public class Student {
   private String name;

   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

 

2.创建视图

public class StudentView {
   public void printStudentDetails(String studentName,){
      System.out.println("Student: ");
      System.out.println("Name: " + studentName);
   }
}

 

3.创建控制器

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 updateView(){           
      view.printStudentDetails(model.getName());
   }  
}

 

4.MVC模型演示

public class MVCPatternDemo {
   public static void main(String[] args) {
 
      //从数据库获取学生记录
      Student model  = retrieveStudentFromDatabase();
 
      //创建一个视图:把学生详细信息输出到控制台
      StudentView view = new StudentView();
 
      StudentController controller = new StudentController(model, view);
 
      controller.updateView();
 
      //更新模型数据
      controller.setStudentName("mikechen");
 
      controller.updateView();
   }
 
   private static Student retrieveStudentFromDatabase(){
      Student student = new Student();
      student.setName("mikechen");
      return student;
   }
}

 

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法