剪不斷,理不亂——三層架構之抽象工廠加反射

來源:互聯網
上載者:User

        三層架構前面已經介紹過了,淺談三層架構。本篇文章主要介紹三層架構中加入抽象工廠和反射加設定檔。以機房收費系統的登入狀態例。

        首先對機房收費系統進行分層,分為三層展示層,商務邏輯層,資料訪問層。為了降低系統的耦合性,符合系統的開放封閉原則又加入了面板模式和抽象原廠模式。下面是我畫的包圖。

       

 

        在畫包圖的過程中也是在對系統的認識一步步加深的,也是在不斷的修改過程中逐步完善起來的。 圖中很明白的體現出了各層之間的參考關聯性。

        在U層和B層之間加入了面板模式,使U層和B層分離,為系統提供一個簡單的介面,使得耦合性大大降低,減少了它們之間的依賴.

       在B層和D層之間加入了抽象原廠模式,使得B層和D層分離,通過抽象工廠加反射返回一個介面,D層去實現介面,體現了D層的可移植性.

      

      下面畫的是機房收費系統登入的時序圖:

 

 

 

U層負責資料的輸入,代碼如下

Public Class frmLogin    '登入代碼    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click        '把使用者名稱和密碼放到一個實體中        Dim user As New Entity.UserInfo        user.userName = txtUserName.Text        user.passWord = txtPassWord.Text        Dim loginUI As New Facade.LoginFAC        Dim strResult As String        strResult = loginUI.login(user)        '使用者名稱和密碼驗證的幾種情況        Select Case strResult            Case "此使用者不存在"                MsgBox("此使用者不存在,請重新輸入使用者名稱!")                txtUserName.Focus()                txtUserName.SelectAll()            Case "密碼不正確"                MsgBox("密碼不正確,請重新輸入密碼!")                txtPassWord.Focus()                txtPassWord.SelectAll()            Case "此使用者已經線上"                MsgBox("該使用者已線上", "警告")            Case "登入成功"                frmMain.Show()                'Me.Close()        End Select    End Sub    '退出    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click        End    End SubEnd Class

外觀層負責登入時驗證使用者名稱和密碼是否合法

Imports BLLPublic Class LoginFAC    Public Function login(ByVal user As Entity.UserInfo) As String        Dim ConfirmUserBll As New BLL.ConfirmUser        '調用B層的方法驗證使用者名稱和密碼是否存在        If Not ConfirmUserBll.IsExists(user) Then            Return "此使用者不存在"        Else            If Not ConfirmUserBll.ConfirmPwd(user) Then                Return "密碼不正確"            Else                Return "登入成功"            End If        End If    End FunctionEnd Class

B層負責邏輯處理,使用者名稱和密碼的驗證邏輯

Imports FactoryImports IDAL'驗證使用者Public Class ConfirmUser    '使用者名稱存在不存在    Public Function IsExists(ByVal user As Entity.UserInfo) As Boolean        Dim Iuser As IDAL.IUserInfo        Dim factory As New Factory.DBFactory        'factory = DBFactory.GetIstance        '調用工廠的方法建立出一個介面        Iuser = factory.CreateUserDAO()        If Iuser.QueryUserInfo(user).userName = "" Then            Return False        Else            Return True        End If    End Function    '驗證密碼正確不正確    Public Function ConfirmPwd(ByVal user As Entity.UserInfo) As Boolean        Dim Iuser As IDAL.IUserInfo        Dim factory As New Factory.DBFactory        'factory = DBFactory.GetIstance        Iuser = factory.CreateUserDAO        If Iuser.QueryUserInfo(user).passWord = "" Then            Return False        Else            Return True        End If    End FunctionEnd Class

 

 

抽象工廠負責資料庫的選擇和建立介面

Imports System.ReflectionImports System.ConfigurationImports IDALPublic Class DBFactory    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")    'Dim strSpace As String = strDB & "DAL"    'Dim strClassName As String    Public Function CreateUserDAO() As IDAL.IUserInfo        Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strDB), IUserInfo)    End FunctionEnd Class

         在這裡利用抽象工廠的二維性,一個是資料庫的選擇,另一個是表的選擇,利用抽象工廠可以以很方便的對資料庫進行選擇,只需要更改設定檔中的內容就好了,不需要更改其它地方,很好的體現了開放封閉原則.

 

 

IDAL層負責放置介面

Public Interface IUserInfo    '查詢使用者的介面函數    Function QueryUserInfo(ByVal user As Entity.UserInfo) As Entity.UserInfoEnd Interface


 

D層負責執行個體化介面,和資料庫打交道

Imports EntityImports IDALImports System.Data.SqlClientPublic Class Sqlserver : Implements IUserInfo    '調用設定檔與資料庫的串連    Dim strConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("Connstr")    Dim conn As SqlConnection = New SqlConnection(strConnStr)    '查詢使用者和密碼是否存在    Public Function QueryUserInfo(ByVal user As Entity.UserInfo) As Entity.UserInfo Implements IUserInfo.QueryUserInfo        Dim Sqlserver As String = "select * from T_User where userName='" & user.userName & "'"        Dim cmd As SqlCommand = New SqlCommand(Sqlserver, conn)        Dim read As SqlDataReader        Try            conn.Open()            read = cmd.ExecuteReader            read.Read()            user.userName = read.Item("userName")            user.passWord = read.Item("passWord")            Return user        Catch ex As Exception            user.passWord = ""            Return user        End Try    End FunctionEnd Class

 

         總結:通過理論的學習,在實踐中才能成長的更快。三層架構很好的體現了分層的思想,通過把系統分成個層次,結構更加清晰明了,通過設計模式的加入讓我的系統開發維護起來更加方便,完善。比如加上策略模式實現對演算法的封裝,解決對固定使用者與臨時使用者的計費方式。相反有時候還會感覺到加上三層和設計模式後代碼量的增多。

 

本篇文章是我對分層思想以及設計模式的淺顯的認識,望各位大蝦指點。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.