这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
上面这幅图大家应该不陌生,工作过程当中一直坚持着上述流程在开发。也就是最典型 我们最开始接触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,还有专门负责数据库的交互,所以这也算是原因之一吧
下面我给出一幅图,后端应该严格按照此流程开发
职责清晰,可复用性强。我们在实际开发中大多应该是跟这个一摸一样的。可能缺少比较多的是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设计反而会降低开发效率,层和层虽然相互分离,但是之间关联性太强,没有做到独立的重用。
这里还是要提一句,不管是自己一个人开发还是多人,希望都要严格遵守上面我的那幅图来开发。
弦外之音
一直坚持看我设计模式的人可能知道,设计模式专栏还没有讲完,中间有几天没有讲,是想着最后留着的是最重要的,在我们平常实战过程当中运用最多的,所以我想好好设计一下。争取让每个人看了都怒赞。
还是多唠叨几句,欢迎大家关注,点赞,我后面会持续输出干货,大家也可以点击我头像,查看历史干货!
加油! 我们下期再见!