MVC设计模式和MVC框架的思考

◇◆丶佛笑我妖孽 提交于 2019-12-02 02:09:28

名词

 

先摘一些东西过来。

 

架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不同需求抽象成为抽象组件,并且能够描述这些抽象组件之间的通信和调用。

框架:软件框架是项目软件开发过程中提取特定领域软件的共性部分形成的体系结构,不同领域的软件项目有着不同的框架类型。框架不是现成可用的应用系统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。

设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,它强调的是一个设计问题的解决方法。

 

 

MVC分层

 

至于MVC分层,目前看到的两种主流的分层是这样的。具体的技术,就Java EE来说。

1. View,用JSP实现。

2. Controller,用Action实现。

3. Model,用Service和JavaBean实现。JavaBean也就是entity,pojo。简单的成员变量,以及一组get和set方法。

V和C,如果用框架,可以用Struts来统管。

底层要操作数据库的话,一般可用DAO(数据访问对象)。一般一张表对应一个DAO。

在使用Hibernate框架以后(或者自己用Java的反射写一个类似于Hibernate的东西以后),

可以将这些DAO的公共部分(e.g. CRUD操作)抽取出来,作为父类BaseDAO,其余DAO继承BaseDAO。

DAO层里面操作数据库,可能需要有数据库的操作对象,例如xxx数据库链接等。Hibernate里好像叫什么session,或者不用Hibernate,原生态Java的话,就是JDBC链接。写Python的话,大概就是xxxConnection,或者sqlAchemy的Engine。

如果要统一管理MVC三层,spring也是没有问题的。

 

 

调用顺序

 

 

Service由Controller调用,DAO由Service调用。

至于DAO和Service,可以先定义好其Interface,由BaseInterface派生出各个具体的Interface,其实现类BaseImplement实现接口,并override里面规定的方法,实现多态。

至于为什么要实现多态,也许是为了便于集中管理、少写代码。目前我接触到的项目比较小,似乎多态还没有体现出其强大的功能。

 

 

SQL出现的位置

 

有人说全部写到DAO里面,DAO向上提供函数接口,Service层调用即可。

有人说DAO里面写一些统一的、简单的CRUD,例如select * from tableA;, select * from tableA where _id = ?,复杂一点的、功能非常独立的,基本不会被别人用到的SQL或者HQL写到service层。

我认为两种做法都没什么问题,只要能统一,而为了迎合更多人的口味,还是写第一种吧。

只要不是这里很复杂的查询放到service层,那里的复杂查询放到DAO层。这种写法,很不幸,没见过,看不懂。

一个service不一定只对应一张表,例如需要联合查询的时候,一个service可能需要用到多个DAO,这也是没有问题的。

 

 

联合查询,用哪个DAO

 

 

假设数据库符合3范式。3张表,一张学生表,一张书籍表,一张学生拥有的书籍表。有主外键关系。

要查数据库,最后在页面上显示,张三,有数学书、英语书,李四,有语文书、物理书。DAO用哪个?

假设还没有用Hibernate这类的ORM框架。

几种做法吧。不用联合查询,3个DAO,分三批查询。第一次查用户、第二次查书,第三次查学生拥有的书籍。

用联合查询,就用studentDAO,然后student的domain对象里,封装好一个List<Book> bookList对象,剩下的我就不多说了。

项目小,无所谓,看怎么方便。

 

DAO对应一张表还是一个库

 

 

这个问题相当于问DAO的个数。是一个库就一个DAO,还是一张表一个DAO,其实无所谓,只是看规模大小和使用的方便程度了。

 

 

JSP Model1和Model2

 

 

 

Model 2模式最早在1998年应用在JSP应用程序当中,JSP Model 1应用管理的混乱诱发了JSP参考了客户端MVC模式,催生了Model 2。

 

后来这种模式几乎被应用在所有语言的Web开发框架当中。PHP的ThinkPHP,Python的Dijango、Flask,NodeJS的Express,Ruby的RoR,基本都采纳了这种模式。平常所讲的MVC基本是这种服务端的MVC。

 

 

结语

 

 

问题来了,为什么要用MVC分层?你甚至可以把数据库连接,操作数据库的代码全部放到View层,不是吗?JSP代码里面,是完全可以写Java代码的。

至于为什么,我就不多说了。之前实习的地方,1200多行代码就放到一个文件(outsideCode.py)里,有什么模式,什么分层,想怎么干就怎么干,还不是照样能跑得很愉快。只是我的实习日志里,80%的东西都是写在如何如何整这个outside。最后实在看不下去,推倒重来。结束。为什么我受不了Model1,大概是智力问题。也有可能是接触了Model2,于是看不上Model1,受不了。尽管苹果有很多诟病,尽管我不是在为苹果打广告,尽管我的APP也是在Android上开发的。但是,当你用了iPhone以后,你还会换成Android吗?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!