前言:
機房上機,我們需要判斷卡号是否存在,餘額是否充足,該卡是否正在上機,這一系列的請求正好使用設計模式中的職責連模式解決這個問題,進而減少If語句的使用,減少代碼的使用。
内容:
一、職責連模式
職責連模式:使多個對象都有機會處理請求,進而避免請求的發送者和接受者之間的耦合關系。将這些對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有一個對象處理他為止。

二、機房上機流程圖
流程:單擊上機按鈕,将上機資訊(卡号)傳到外觀層(想當于接口),邏輯層根據實際情況調用請求,直至請求處理為止。
三、代碼
1、UI層
Private Sub btnOnLine_Click(sender As Object, e As EventArgs) Handles btnOnLine.Click
If txtCardNo.Text = "" Then
MsgBox("請輸入卡号")
Return
End If
Dim Card As New Entity.EntityCard
Dim CheckMoney As New Entity.EntityCard
Dim line As New Entity.LineLogEntity
Dim student As New Entity.EntityStudent
Dim facade As New Facade.OnFacade
Dim result As Boolean
Card.CardNo = Trim(txtCardNo.Text)
line.CardNo = txtCardNo.Text
student.CardNo = txtCardNo.Text
'監測是否符合上機要求
result = facade.CheckOn(Card, line)
line.OnDate = Format(Now, "yyyy-MM-dd HH:mm:ss")
line.CardNo = txtCardNo.Text
'符合上機要求
If result = True Then
Dim facade1 As New Facade.OnFacade
Dim table As Boolean
'更新上機記錄表
table = facade1.AddOnline(line)
'更新成功
If table = True Then
Dim facadeS As New Facade.OnFacade
Dim table1 As New DataTable
'顯示上機資訊
table1 = facadeS.selectstudentF(Card)
txtType.Text = table1.Rows(0).Item(2)
txtStudentNo.Text = table1.Rows(0).Item(1)
txtStudentName.Text = table1.Rows(0).Item(3)
txtDepartment.Text = table1.Rows(0).Item(4)
txtSex.Text = table1.Rows(0).Item(5)
txtOnDate.Text = line.OnDate
txtBalance.Text = table1.Rows(0).Item(6)
MsgBox("上機成功!")
End If
Else
MsgBox("卡号不存在或已上機,或金額不足,請确認滿足以上條件!")
End If
End Sub
2、Facade層
Public Function CheckOn(ByVal card As Entity.EntityCard, ByVal line As Entity.LineLogEntity) As Boolean
Dim CheckCard As New BLL.CheckCardBLL
Dim CheckMoney As New BLL.CheckMoneyBLL
Dim CheckOnLine As New BLL.CheckOnLineBLL
CheckCard.SetSuccessor(CheckMoney)
CheckMoney.SetSuccessor(CheckOnLine)
Return CheckCard.OnRequest(card, line)
End Function
3、BLL層
(1)抽象基類
Imports System.Data.SqlClient
Imports Entity
Imports IDAL
Imports Factory
'MustInherit-定義抽象基類
Public MustInherit Class OnBLL '上機抽象類
Protected successory As OnBLL
Public Sub SetSuccessor(ByVal successory As OnBLL) '設定繼任者
Me.successory = successory
End Sub
'MustOverride--定義抽象方法,用于子類的重寫
Public MustOverride Function OnRequest(ByVal card As Entity.EntityCard, ByVal line As Entity.LineLogEntity) As Object
End Class
(2)檢查卡号是否存在
Public Class CheckCardBLL : Inherits OnBLL
'檢視卡号是否存在
Public Overrides Function OnRequest(card As Entity.EntityCard, line As Entity.LineLogEntity) As Object
Dim factory As New Factory.OnLineFactory
Dim Icardno As IDAL.IOnLine
Dim mylist As New List(Of Entity.EntityCard)
Icardno = factory.OnLinefactory()
mylist = Icardno.CheckCardNo(card)
If mylist.Count <= 0 Then
Return False
Else
Return successory.OnRequest(card, line)
End If
End Function
End Class
(3)檢查餘額是否充足
Public Class CheckMoneyBLL : Inherits OnBLL
Public Overrides Function OnRequest(card As Entity.EntityCard, line As Entity.LineLogEntity) As Object
Dim factory As New Factory.OnLineFactory
Dim Icardno As IDAL.IOnLine
Dim mylist As New List(Of Entity.EntityCard)
Icardno = factory.OnLinefactory()
mylist = Icardno.CheckCardNo(card)
If (CDec(mylist(0).Balance)) <= 0.0 Then
Return False
Else
Return successory.OnRequest(card, line)
End If
End Function
End Class
(4)檢查是否正在上機
Public Class CheckOnLineBLL : Inherits OnBLL
Public Overrides Function OnRequest(card As Entity.EntityCard, line As Entity.LineLogEntity) As Object
Dim factory As New Factory.OnLineFactory
Dim Icardno As IDAL.IOnLine
Dim mylist As New List(Of Entity.LineLogEntity)
Icardno = factory.OnLinefactory()
mylist = Icardno.CheckOnLine(line)
If mylist.Count <= 0 Then
Return True
Exit Function
Else
Return False
End If
End Function
End Class
4、接口層
Public Interface IOnLine
'檢查卡表是否存在,是否餘額充足
Function CheckCardNo(ByVal card As Entity.EntityCard) As List(Of Entity.EntityCard)
'檢查是否正在上機
Function CheckOnLine(ByVal line As Entity.LineLogEntity) As List(Of Entity.LineLogEntity)
'更新上機記錄表
Function updateOnLine(ByVal line As Entity.LineLogEntity) As Boolean
Function SelectStudent(ByVal card As Entity.EntityCard) As DataTable
End Interface
5、DAL層
Public Class OnDAL : Implements IOnLine
'檢查卡表是否存在,是否餘額充足
Public Function CheckCardNo(card As EntityCard) As List(Of Entity.EntityCard) Implements IOnLine.CheckCardNo
Dim sql As String
Dim table As New DataTable
Dim sqlhelper As New SQLHelper.sqlhelper
Dim paras As SqlParameter() = {New SqlParameter("@CardNo", card.CardNo),
New SqlParameter("@state", "使用")}
sql = "select * from Y_Card_Info where CardNo [email protected] and [email protected]"
table = sqlhelper.ExecSelect(sql, CommandType.Text, paras)
Dim mylist As List(Of Entity.EntityCard)
mylist = ConvertHelper.convertToList(Of EntityCard)(table)
Return mylist
End Function
'檢查是否正在上機
Public Function CheckOnLine(line As LineLogEntity) As List(Of Entity.LineLogEntity) Implements IOnLine.CheckOnLine
Dim sql As String
Dim table As New DataTable
Dim sqlhelper As New SQLHelper.sqlhelper
Dim paras As SqlParameter() = {New SqlParameter("@CardNo", line.CardNo),
New SqlParameter("@state", "正在上機")}
sql = "select * from Y_LineLog_Info where [email protected] and state [email protected]"
table = sqlhelper.ExecSelect(sql, CommandType.Text, paras)
Dim mylist As List(Of Entity.LineLogEntity)
mylist = ConvertHelper.convertToList(Of LineLogEntity)(table)
Return mylist
End Function
'更新上機記錄表
Public Function updateOnLine(line As LineLogEntity) As Boolean Implements IOnLine.updateOnLine
Dim sql As String
Dim table As Boolean
Dim sqlhelper As New SQLHelper.sqlhelper
line.Computer = System.Net.Dns.GetHostName().ToString()
Dim paras As SqlParameter() = {New SqlParameter("@CardNo", line.CardNo),
New SqlParameter("@UserID", Entity.CommonVariable.CommonUserID),
New SqlParameter("@OnDate", line.OnDate),
New SqlParameter("@state", "正在上機"),
New SqlParameter("@Computer", line.Computer)}
sql = "insert into Y_LineLog_Info (CardNo,UserID,OnDate,state,Computer) values(@CardNo,@UserID,@OnDate,@state,@Computer)"
table = sqlhelper.ExecAddDelUpdate(sql, CommandType.Text, paras)
Return table
End Function
End Class
三、總結
通過敲機房,又重新溫習了一遍設計模式,設計模式還需要我們再去學習,隻有多實踐才能更加靈活的去使用它們。