三層架構前面已經介紹過了,淺談三層架構。本篇文章主要介紹三層架構中加入抽象工廠和反射加設定檔。以機房收費系統的登入狀態例。
首先對機房收費系統進行分層,分為三層展示層,商務邏輯層,資料訪問層。為了降低系統的耦合性,符合系統的開放封閉原則又加入了面板模式和抽象原廠模式。下面是我畫的包圖。
在畫包圖的過程中也是在對系統的認識一步步加深的,也是在不斷的修改過程中逐步完善起來的。 圖中很明白的體現出了各層之間的參考關聯性。
在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
總結:通過理論的學習,在實踐中才能成長的更快。三層架構很好的體現了分層的思想,通過把系統分成個層次,結構更加清晰明了,通過設計模式的加入讓我的系統開發維護起來更加方便,完善。比如加上策略模式實現對演算法的封裝,解決對固定使用者與臨時使用者的計費方式。相反有時候還會感覺到加上三層和設計模式後代碼量的增多。
本篇文章是我對分層思想以及設計模式的淺顯的認識,望各位大蝦指點。