浅谈model1与model2

本文介绍了早期Web开发中的Model1设计模式及其局限性,对比之下详细阐述了Model2(MVC)设计模式的优点,包括清晰的逻辑、更高的代码重用率及更好的扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在web早期的开发中,通常采用的都是model1。Model1设计模式中,主要分为两层,视图层和模型层。那么,项目中的业务流程该如何处理呢?实际上,model1模式中jsp就充当了这个角色,也就是说一切的业务逻辑都是由jsp来处理的,通常是通过jsp直接调用模型来处理相关的业务,model1是以jsp为中心的。举个例子,比如我们用model1模式开发了一个网站,该网站可以注册会员,那么当我们在注册页面中点击提交时,我们在页面中输入的数据就直接提交给一个jsp对象了,然后由该jsp对象直接调用dao类对象,往数据库中插入一条注册记录,实际上,该jsp对象可以直接就是展示注册页面给我们的jsp。好了,看完例子,我们是否会觉得model1的设计模式在逻辑上比较混乱呢?我想答案是肯定的,要不然也不会引出现在正流行的mvc设计模式了。然而,model1也还是有其自己的优点的。那就是,对于一个小项目而言,采用model1模式来开发,开发效率往往会更高。但是,model1开发模式所带来的问题是,使用该模式开发的项目难以扩展,难以维护,代码重用率也相当低。
由于现在人对软件质量的要求越来越高,软件项目的规模也越来越大,所以model1设计模式绝对不再适用于现在的软件开发。现在的软件开发是以工程的思想进行的,因此,model2,也就是mvc设计模式,自然而然就受到了人们的追捧了。Model2设计模式,把一个web软件项目分成三层,包括视图层、控制层、模型层。这样的分层思想,不仅提高的代码的重用率、项目的扩展性,而且大大降低了项目的维护成本。此外,model2设计模式的这种分层思想,在逻辑上相当的清晰,易被人们接受,而且便于开发人员的分工合作,因此,大大提升了开发效率。现在,具体谈一下model2的三层结构是如何完成一个业务流层的吧。首先,要先介绍一下,model2中的三层结构都包含了那些内容:视图层包括jsp、html、css、javascript、图片等,控制层由servlet构成,模型层由javaBean构成(包括dao、vo、action等)。其次,对于一个具体的业务请求,这三层结构到底是如何配合完成的呢?举个例子,为了跟model1模式做比较,我们还是引用注册会员的例子。当我们点击注册页面上的提交按钮时,客户端的注册请求不再是传给一个jsp对象了,而是传给了一个servlet对象(控制层,我们定义该servlet对象做为主控servlet,由它来接收所有的业务请求,然后决定交给哪个action对象来处理,最后由它来接收action对象返回的数据并跳转到指定的url),然后由该servlet对象决定将业务请求交给哪个具体的action对象来处理,然后当action对象处理完请求后,便返回一个url给该servlet对象,由该servlet对象根据返回的url决定跳转到哪个页面(即决定将哪个页面展示给客户端)。另外,需要提到的一点就是,刚刚提到的action对象实际上是model2模型中最关键的部分,因为它是model2中真正干活的组件,它解决的是做什么的问题,然后由它通过调用相关的业务组件(模型)来完成相应的业务,业务组件解决的是如何做的问题。对于action对象该划分到控制层还是模型层的问题,其实这是有所争议的。个人比较赞成把它归到控制层中去,因为它实际上并不执行具体的业务,只是调用相关的业务模型对象来处理罢了,换句话说,它不应该包含过多的业务逻辑,而应该只是简单地收集客户端传过来的数据,并将这些数据传给具体的业务处理对象来处理,最后,由它决定跳转到那个url,并由主控servlet执行跳转。确切的来说,我认为它可以理解为是控制层与具体model对象的适配器。
Qt Model/View/Delegate 是 Qt 提供的一种用于实现 MVC 设计模式的框架,其中 Model 负责存储数据,View 负责显示数据,Delegate 负责定制数据的显示方式。 在 Model 中,我们可以通过实现 `roleNames()` 函数来定义数据的角色名称。这些角色名称可以被 View Delegate 使用来访问 Model 中的数据。 `roleNames()` 函数返回一个 `QHash<int, QByteArray>` 类型的值,其中键是角色的编号,值是角色的名称。对于一个标准的 Model,Qt 提供了一些已经定义好的角色,例如 `Qt::DisplayRole` 用于显示数据,`Qt::EditRole` 用于编辑数据等。 我们也可以自定义角色,例如在一个存储学生信息的 Model 中,我们可以自定义一个 `Qt::UserRole` 角色,用于存储学生的分数信息。在 `roleNames()` 中,我们可以这样定义: ```cpp QHash<int, QByteArray> StudentModel::roleNames() const { QHash<int, QByteArray> roles; roles[Qt::DisplayRole] = "display"; roles[Qt::UserRole] = "score"; return roles; } ``` 在 View 中,我们可以使用 `data()` 函数来访问 Model 中的数据,同时指定要访问的角色。例如: ```cpp QVariant score = model->data(modelIndex, Qt::UserRole); ``` 在 Delegate 中,我们可以重写 `setModelData()` 函数来更新 Model 中的数据,同时指定要更新的角色。例如: ```cpp void ScoreDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); QString score = lineEdit->text(); model->setData(index, score, Qt::UserRole); } ``` 通过定义使用自定义角色,我们可以更加灵活地操作 Model 中的数据,并将数据以更加自然的方式展示给用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值