天天看點

機房上機--職責連模式前言:内容:三、總結

前言:

機房上機,我們需要判斷卡号是否存在,餘額是否充足,該卡是否正在上機,這一系列的請求正好使用設計模式中的職責連模式解決這個問題,進而減少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
           

三、總結

 通過敲機房,又重新溫習了一遍設計模式,設計模式還需要我們再去學習,隻有多實踐才能更加靈活的去使用它們。