周六加完班,聊聊MVC思想模式

808 阅读6分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

image.png

上面这幅图大家应该不陌生,工作过程当中一直坚持着上述流程在开发。也就是最典型 我们最开始接触java搞的这一套。Jsp + Servlet + JavaBean的模式

这种mvc不只是应用于我们的代码逻辑分层,更多的是一种思想。一种分层思想。一种抽象思想。我觉得肯定有人想过,把所有的逻辑代码能不能都写在controller类里面,没有service层,controller直接调用我们的数据库dao层。这样岂不是很省事。

今天呢,先不直接聊mvc,先稍带着讲下后端的的分层。我感觉这是一种方法论,大家掌握了方法论,很多问题也就迎刃而解。

接下来会先讲下个人见解,最后会用mvc模式结合代码实践下

如果没有service层

接着上面我们说的聊下,没有service,直接controller调用dao层岂不是更香,我只能说这种香是你感官上的香。

如果没有service层,换句话问,service层起着什么作用。

  • 逻辑如果全部在controller,第一逻辑没办法复用,service的一个方法,常常被多个接口controller去调用。全部写在controller里,复用性为0。

  • service层是业务逻辑的处理者与组装者,service去调用其他的dao层来完成逻辑的组装与调用,如果都放到controller,代码臃肿,业务逻辑不清晰。常常会出问题,亦极难发现问题

  • 分层即代表着职责清晰,逻辑鲜明,接口(controller)负责暴露,但是业务逻辑不能暴露。

  • 团队合作,在最开始的时候,一个团队可能有专门的人写controller,专门的人负责写service,还有专门负责数据库的交互,所以这也算是原因之一吧

下面我给出一幅图,后端应该严格按照此流程开发

image.png

职责清晰,可复用性强。我们在实际开发中大多应该是跟这个一摸一样的。可能缺少比较多的是dao层,应该会有不少小伙伴直接在service调用mapper。以后大家可以注意下。

好,先说这么多,接下来说下mvc(看到这你可能觉得都懂,别不往下看,下面我会用代码结合这种思想来点实践)

MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范

M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。更好的调节M和V的搭配。

MVC严格意义上来说不是一种设计模式,更多的是一种框架模式,框架通常是代码重用,而设计模式是设计重用,而架构则介于两者之间,部分代码重用,部分设计重用。

VIEW(视图)

视图是用户看到并与之交互的界面,最常见的就是html,jsp,freemark等各种前端语言,总之可以被浏览器解释成用户界面的一切语言

Modele(模型)

在MVC的三个部件中,模型拥有最多的处理任务。例如来对数据库的操作,被模型返回的数据是中立的,就是说模型与数据将要显示的格式无关,这样一个模型能为多个视图提供数据,也就是说数据在显示的时候有多种显示模式,例如css可以给同样的数据多种显示模式,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

什么意思。总之就是,后端当中的实体,service等逻辑的处理是可以被多个客户端获取共享的。

Controller(控制层)

是的,为什么叫控制层,该层是承上启下,从后面拿数据给前端。起着不可替代的控制性作用。好,其他乏味的概念不多说,我么进入正题,用代码怎么去演示这种思想。

代码展示

我们创建一个的 Student 对象,作为模型。 再创建一个把学生详细信息输出到控制台的视图类StudentView,StudentController是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentsView。

//模型
@Data
public class Student {

   private String name;
   
   private int age;
}
//视图
public class StudentView {
   public void printStudentDetails(String studentName, int studentAge){
      System.out.println("Name: " + studentName);
      System.out.println("age: " + studentAge);
   }
}
//控制层
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 setStudentAge(int age){
      model.setAge(age);      
   }

   public String getStudentAge(){
      return model.getAge();     
   }

   public void updateView(){           
      view.printStudentDetails(model.getName(), model.getAge());
   }  
}

我们用 MVCPatternDemo 来演示 MVC 模式的用法


public class MVCPatternDemo {
   public static void main(String[] args) {

      //从数据可获取学生记录
      Student model  = retriveStudentFromDatabase();

      //创建一个视图:把学生详细信息输出到控制台
      StudentView view = new StudentView();

      StudentController controller = new StudentController(model, view);

      controller.updateView();

      //更新模型数据
      controller.setStudentName("李四");

      controller.updateView();
   }

   private static Student retriveStudentFromDatabase(){
      Student student = new Student();
      student.setName("张三");
      student.setAge(10);
      return student;
   }

}


//输出
Name: 张三
age: 10

Name: 李四
age: 10

OK 今天就讲到这里,我们要理解这种分层开发,更要应用于各种问题方案上

总结

  • 优点:分层,结构清晰,耦合性低,大型项目代码的复用性得到极大的提高,开发人员分工明确,提高了开发的效率,维护方便,降低了维护成本。

  • 缺点:简单的小型项目,使用MVC设计反而会降低开发效率,层和层虽然相互分离,但是之间关联性太强,没有做到独立的重用。

这里还是要提一句,不管是自己一个人开发还是多人,希望都要严格遵守上面我的那幅图来开发。

弦外之音

一直坚持看我设计模式的人可能知道,设计模式专栏还没有讲完,中间有几天没有讲,是想着最后留着的是最重要的,在我们平常实战过程当中运用最多的,所以我想好好设计一下。争取让每个人看了都怒赞。

还是多唠叨几句,欢迎大家关注,点赞,我后面会持续输出干货,大家也可以点击我头像,查看历史干货!

加油! 我们下期再见!

设计模式之单例模式

设计模式之工厂模式

设计模式之建造者模式

设计模式之代理模式

设计模式之访问者模式

设计模式之适配器模式

设计模式之命令者模式

java状态模式 | 随时随地监控状态改变

java观察者模式 | 如何通知事物的变化

java备忘录模式 | 如何记录历史信息

java迭代器模式模式 | 如何对各个元素进行访问

java享元模式 | 如何共享对象

java解释器模式 | 自定义规则实现逻辑

java桥接模式 | 抽象与不同实现的绑定

看!责任链模式来了