代码改变世界

三层架构实例

2011-10-03 08:02  javaspring  阅读(1388)  评论(0编辑  收藏  举报

一、概要
在我的上一篇博客中,我们谈了谈分层,到底为什么分层(http://blog.csdn.net/shan9liang/article/details/6836300
这篇博客,准备用一个小Demo来介绍应该实现三层架构。三层架构只是分层的一种经典形式,到底分几层,要依具体情况而定,考虑到系统的复杂程度,和后期的可维护性,完全可以分四层,五层,甚至六层,七层。
 
三层架构(3-tierapplication),通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想(《百度百科》)
 
二、DEMO
1、实现语言:VB.NET
2、需求:《学校机房收费系统》中的一个功能:操作员为学生注册机房上机卡。
3、用例图:


4、三层架构下的包图:


注:Entity中放的都是实体类,即由数据库中的表抽象出来的类。实体类主要作为数据的载体,在各个层之间被传递。
 
我们现在要做的就是对用例图中所示的这个功能进行抽象,即分别在UI,BLL,DAL三层抽象类。
 
数据访问层DAL:数据库中的一张表对应DAL层的一个类,所以这里要有一个dal_DealStudentInfo类,它必然有一个方法AddRecord,用于向数据库中添加数据。这个方法的参数便是studentInfo这张表映射出的一个实体类的一个实例,方法中包含了一些SQL语句。IsExist是验证数据有效性,这里主要是检验用户是否已经存在。图示:



关键代码如下:

Public Class dal_DealStudentInfo
    Public Function AddRecord(ByVal RecInfo As Student) As Boolean
        '……
        '连接数据库
        '……

        '……
        Try
            'SQL语句向数据库中写入数据
            '……
            Return True
        Catch
            Return False
        Finally
            '关闭数据库
        End Try

    End Function

    Public Function IsExist() As Boolean
        '查询数据库,如果存在该卡,则返回True,不存在则返回false
        If  '存在
            Return True
        Else
            Return False
        End If

    End Function
End Class

业务逻辑层BLL:这里会有一个类bll_ControlStudent与DAL层中的dal_DealStudentInfo类对应,调用dal_DealStudentInfo的AddRecord方法,这个方法传递的参数就是UI层传递过来的studentInfo实体类的一个实例。如果需要验证输入合法性,也放在bll_ControlStudent中,并与dal_DealStudentInfo中的方法相对应,可以单独用一个方法,也可以集成到AddStudent中,我这里因为只是进行了简单的判断,就把它放到了AddStudent。
图示:




关键代码如下:

Public Class bll_ControlStudent

    Public Function AddStudent(ByVal student As Student) As String


        Dim DealStudent As New dal_DealStudentInfo
        If Not (DealStudent.IsExist) Then
            If DealStudent.AddRecord(student) Then
                Return "注册成功"
            Else
                Return "注册失败"
            End If
        Else
            Return "该卡已经存在,请重新输入卡号"
        End If
    End Function
End Class


表现层UI:这里肯定有一个窗体类frmRegister。上面有一些控件,这里我简要画了一个界面:


在按钮确定的事件下,我们需要实例化studentInfo这张表映射出的一个实体类,把这个对象作为一个参数,传递给BLL层中的类bll_ControlStudent。
关键代码:

Public Class frmRegister

    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
        Dim strMsg As String

        Dim student As New Student(Trim(txtCardNo.Text), Trim(txtStuName.Text), Trim(txtStuNo.Text), Trim(txtDepartment.Text), Val(txtMoney.Text))
        Dim ControlStudent As New bll_ControlStudent

        strMsg = ControlStudent.AddStudent(student)
        MessageBox.Show(strMsg)

    End Sub

    Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        Me.Close()
    End Sub
End Class

4、总体的关系类图:


五、总结
本文主要通过一个小demo简要实现了三层架构,我们看到三层架构的主要特点:UI调用BLL中类的方法,即UI知道BLL的方法,但不知道方法实现的细节,而BLL层并不知道UI的存在.同样BLL层调用DAL,而DAL也不知道BLL的存在。三者中任何一者发生变化都不会影响其他俩者的正常工作,只对变化者进行重新调整即可。三层把Entity实体类的实例作为参数来传递.
总之,表示层只提供软件系统与用户交互的接口;业务逻辑层是界面层和数据访问层之间的桥梁,负责数据处理和传递;数据访问层只负责数据的存取工作。