APP下载

MVC设计模式应用问题探讨

2013-08-03王亚萍张红霞

山东工业技术 2013年15期
关键词:设计模式观察者视图

王亚萍 张红霞

(河南农业职业学院,河南 中牟451450)

1 定义阐述

MVC 设计模式: 是一种架构型设计模式, 它本身不引入新的功能,只是指导我们把Web 应用结构做的更加合理,实现逻辑与页面相分离。

功能型设计模式:如单例(保证类的实例唯一)、工厂(选择实现)、值对象(封装数据)、DAO(屏蔽变化)等等。

架构型设计模式:结构性的设计模式,只是让程序更具有结构化。

Java 中MVC 来源思路及进化过程:Servlet =Java + HTML 字符串,问题产生了,由于拼字符串太麻烦→解决方案:HTML 独立出来从而得到→JSP≈HTML+Java 脚本(问题又产生了,能解决Servlet 问题,但是带来了页面和逻辑混杂)→解决方案:MVC(指导我们让Web 应用程序结构更加合理)。

2 MVC 三部分内容及各部分功能如下

①Model:VO+逻辑层:可以理解为后台部分。

功能:封装应用状态、响应状态查询、暴露应用功能。

②View:视图层的三大功能,典型的如修改页面,触发事件而不处理,纯jsp 自己处理,提交给Controller 处理。

功能:产生HTML 响应、请求模型更新、提供HTML 表单用于用户请求。

对比: 纯jsp 页面中事件处理与页面展示混杂在一起,MVC 中事件处理由Controller 承担,从而达到逻辑与页面相分离的效果。

③Controller:事件处理过程。

功能:验证HTML 请求的数据、将用户数据与模型更新相映射、选择用于响应的视图。

3 MVC 演化过程及示例

View 用户请求到控制器,控制器状态改变通知Model,Model 主动通知View 说Model 自身已改变,View 主动去Model 里面去状态查询。

下面先看个标准的MVC 单机版的示例:

Eclipse 本身就是基于MVC 做的,例如当我们打开Eclipse 时修改编辑区的代码时,左边的Navigator 视图和右边的Outline 视图等都会自动更新而随着编辑区的代码改变而改变。实际上这些窗口观察的都是同一个Model,即观察XX.java 代码文件的内容,这种多个View 观察者观察同一个Model 文件的在设计模式中也有个设计模式与其对应即观察者设计模式。

观察者设计模式Java 代码示例的如下:

(1)根据前面的内容抽象,首先必须有个被观察的对象,即目标对象叫做MySubject.java:

观察者观察的为目标对象的内容Content, 当内容改变了即有人setContent 需要通知所有的观察者。

(2)其次应该有些观察者,叫做MyObserver:

MyObserver 实现一个update 回调方法, 即MyObserver 去观察MySubject,观察到后采取的处理即这个update 方法。 这里的观察者又有两种模型,一种是被观察者主动推过来的消息即推模型,另一种就是观察者主动去拉内容即拉模型。 其实观察者模式也叫出版订阅模式,推模型即订报的意思,即报刊发行商将报纸送上门服务,拉模型即某个时刻大家主动去报刊亭买报的这种模型。

(3)客户端测试代码,Client.java:

首先创建一个目标对象,然后创建三个观察者,然后注册观察者相当于订报纸,然后报社出报纸即内容改变时触发观察者,当被观察的对象改变时需要通知观察者也即对应MySubject.java。

代码输出结果:

wwu 推过来的====null

wwu 主动去拉====观察者模式

lsi 推过来的====null

lsi 主动去拉====观察者模式

当将Client.java 文件中的MyObserver ob2=new MyObserver("lsi");、和subject.addObserver(ob2);注释掉时,输出结果中间2 行随之也不显示出来,即所谓的lis 退订。

③改进的版的MVC

在Java WEB 开发中会产生一个问题: 就是为什么Model 会主动通知View 自身已经改变了呢?因为Java 中标准的MVC 起源于Swing,这种标准的MVC 只能适应于单机版,在WEB 开发中无法实现,因为WEB 是基于请求应答模式的环境,Model 不会在没有请求的情况下直接通知View 自身的改变。

在实际开发WEB 应用的时候, 由于无法按照标准的MVC 去实现,通常我们会把逻辑部分转移到逻辑层去实现,所以Model 就退变成只用来封装数据,也就是我们常写的VO;此时View 一般不直接和逻辑层交互,所有跟逻辑层的交互都由控制器来实现,View 只和控制器交互。

改进版后的MVC 一般实现方式:View 用JSP 来实现,Controller由Servlet 来实现,Model 由JavaBean 来实现。

[1][美]Robert Lafore.计晓云,赵研,等译.Java 数据结构与算法[M].北京:中国电力出版社,2003.

猜你喜欢

设计模式观察者视图
多普勒效应之新讨论
设计模式识别的特征信息分类研究
“1+1”作业设计模式的实践探索
智慧图书馆环境下的融贯式服务设计模式研究
用追击相遇的模型解释多普勒效应
三维协同设计模式下的航天项目管理实践与展望
“你看不见我”
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图