您的位置:首页 > 其它

对持久层与业务层分离思想的类比化理解

2006-07-16 17:27 176 查看
暑假在家无聊,还不如多多充下电看看书 。在还没放假的时候,自学了STRUTS,体会到了什么叫MVC既,表示逻辑与业务逻辑的分离,虽然开发起来比传统的开发(既JSP和业务逻辑还有持久逻辑写在一起的那种混乱模式)麻烦,但是好处还是显而意见的。

一个软件是否优秀,要看很多方面。我们来谈谈层次结构方面,一个软件的维护,占据了整个软件生命周期的一半以上,如何使得这个漫长的维护过程变得简单易调试呢?我们可以利用分层次结构。打个比方,18世纪的蒸汽机的发明带动了工业革命,人们利用这个前提技术,发明了伟大的火车。以前的火车是蒸汽机车与车厢是固定在一起的,这样的缺点1是可维护性差;2是结构不合理;比如蒸汽机车头故障了,车厢就不能行驶了,这样的结果就导致了资源的浪费。后来人们在漫长的实践与摸索中,设计出了火车的第二个形态,既采用分离式的挂接车厢。这样火车的结构就实现了分层化,这样的好处是,任何一层出现了故障,都可以用正常的车厢来替换,而且能过大型的弯道。

我们软件开发也是如此,以前传统的应用,都是把表示逻辑,业务逻辑,数据逻辑写在一起的。以至于应用出现异常时,维护人员要在混杂的代码种找出引发异常的代码所在。这是一个极其困难,极其低效,极其枯燥的过程。
随着设计模式的发展,更好的设计方案由此而出。那就是将显示逻辑,业务逻辑以及数据逻辑全部分离。

请看下面这个例程(本例子旨在传达思想,具体细节如有错误请读者自行调试改正)

这个例子以很简单的从数据库中查询学生表,显示出学生信息。从而说明如何将表示逻辑,业务逻辑,显示逻辑像分离。

show.jsp
--------------------------------------------------------------

<%@ page contentType="text/html;charset=gb2312"% import="java.sql.*">
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(url);
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select * from t_student");
%>
<html>
<body>
<table>
<tr>
<td>学生编号</td><td>学生姓名</td>
</tr>
<%
while(rs.next()){
%>
<tr>
<td><%=rs.getString("id")%></td><td><%=rs.getString("name")%></td>
</tr>
<%
}
rs.close();
stat.close();
conn.close();
%>
</table>
</body>
</html>

-------------------------------------------------------------------------------

上面这段程序,首先获得一个数据库连接,然后执行SQL语句,把获得的信息放到ResultSet中,再在页面上进行显示。我们可以看到,表示逻辑和业务逻辑还有数据逻辑高耦合在一起了,看起来让人觉得眼花。那么,我们对上面这个例子进行一下改进,从而将三层逻辑分离。

--------------------Tstudent..java---------------用来封装数据信息
package myTest;

public class Tstudent{
private String id;
private String name;

public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}

public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}

---------------------------------TstudentDAO.java -----------------Data Accessor 用来进行数据逻辑的处理
package myTest;
import java.sql.*;
import myTest.Tsutdent;

public class TstudentDAO{
private Connection conn = null;
private PreperdStatement pstat = null;
private ResultSet rs = null;

public TstudentDAO{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:MyDataSource","","");
}catch(ClassNotFoundException e){
System.out.println("驱动加载错误,找不到相关驱动类!" + e);
}
}

public static Tstudent getTsutdentInfoById(String id){
Tstudent student = new Tstudent();
String sql ="select * from Tstudent where id=?";
pstat.setString(1,id);
pstat = conn.prepareStatement(sql);
rs = pstat.executeQuery();
if(rs.next()){
student.setId(rs.getString("id"));
student.setName(rs.getName("name"));
}
return student;
}
}

------------------------------show.jsp-----------------------用来显示数据
<%@ page contentType="text/html;charset=gb2312"% import="java.sql.*" %>
<%@ page import="myTest.*" %>
<%
Tstudent student = TstudentDAO.getTstudentInfoById("1");
%>
<html>
<body>
<table>
<tr>
<td>学生编号</td><td>学生姓名</td>
</tr>
<tr>
<td><%=student.getId()%></td><td><%=student.getName()%></td>
</tr>
</table>
</body>
</html>

这个改进后的版本与第一个版本相比,显示逻辑,业务逻辑,数据逻辑层次关系更加的清晰,分工更加的明确,美工人员可以更加专注于网页的设计,业务逻辑开发人员可以把精力放在功能的实现上,而数据逻辑开发人员,可以更加专精于数据库的操作,从而提升应用的性能。我们如果对任何一个层次进行改动,都不会影响其他的层次,整个程序的维护行得到了大大的提升。

综上说述,一个优秀的应用,采取合理的层次结构,可以让开发,维护,管理更加的方便,快捷,高效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: