1. 程式人生 > >【機房重構】——檢視上機記錄、充值記錄+三層+儲存過程+模板方法

【機房重構】——檢視上機記錄、充值記錄+三層+儲存過程+模板方法

模板方法

定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 即:重複度高的窗體,可以用模板方法,比如組合查詢。少數的不同之處在父類中定義虛方法,在子類中重寫。

分析

一般使用者中,充值記錄,和上機記錄除了查詢的表不一樣,其它一模一樣,所以考慮用模板方法,這樣可以達到事半功倍的效果。         

詳細步驟及程式碼

        父類:新建普通Windows窗體:
U層:
'**********************************************
'說明:U層
'計算機名稱:ZHAOHAN
'建立日期:2015/4/24 16:13:58
'作者:趙寒
'版本號:V2.00
'**********************************************
Public Class frmQueryParent


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnchk.Click
        Dim e_card As New ChargeEntity.EComQueryParent
        Dim b_queryinfo As New ChargeBLL.QueryBLL
        e_card.CardNo = txtcardno.Text
        e_card.GetTable = GetTable()
        If b_queryinfo.queryInfo(e_card) Is Nothing Then
            MsgBox("沒有記錄,請重新設定查詢條件", vbOKOnly, vbExclamation)
            DataGridView1.DataSource = Nothing
        Else
            DataGridView1.DataSource = b_queryinfo.queryInfo(e_card)
        End If

    End Sub

    '定義虛方法
    Protected Overridable Function GetTable() As String
        Return ""
    End Function

   
End Class

B層:
'**********************************************
'說明:B層
'計算機名稱:ZHAOHAN
'建立日期:2015/5/3 11:01:32
'作者:趙寒
'版本號:V2.00
'**********************************************
Public Class QueryBLL
    Public Function queryInfo(ByVal cardno As ChargeEntity.EComQueryParent) As DataTable
        Dim d_query As New ChargeDAL.sqlPQuery
        Dim e_query As New ChargeEntity.EComQueryParent
        Dim table As New DataTable
        table = d_query.GroupQuery(cardno)
        Return table
    End Function
End Class

D層:
'**********************************************
'說明:D層
'計算機名稱:ZHAOHAN
'建立日期:2015/5/3 10:24:35
'作者:趙寒
'版本號:V2.00
'**********************************************

Imports System.Data.SqlClient
Imports IDAL

Public Class sqlPQuery

    Public Function GroupQuery(ByVal info As ChargeEntity.EComQueryParent) As DataTable

        Dim strSql As String = "PROC_QueryLR " '連線儲存過程
        Dim sql As New SqlHelper

        Dim sqlparams As SqlParameter() = {
            New SqlParameter("@datatable", info.GetTable),'儲存過程賦參值
            New SqlParameter("@cardno", info.CardNo)
        }
        Return sql.ExecSelect(strSql, CommandType.StoredProcedure, sqlparams)
    End Function
End Class

實體層:
 <pre name="code" class="vb">Private e_gettable As String
    Public Property GetTable As String'用於存表名
        Get
            Return e_gettable
        End Get
        Set(value As String)
            e_gettable = value
        End Set
    End Property
   
    Private e_cardno As String’用於存卡號
    Public Property CardNo As String
        Get
            Return e_cardno
        End Get
        Set(value As String)
            e_cardno = value
        End Set
    End Property


儲存過程:
CREATE PROCEDURE PROC_QueryLR
@datatable  varchar(20),
@cardno varchar(10)

AS 
declare @tempSql varchar(500)
begin
SET @tempSql='SELECT * FROM '+[email protected]+' where CardNo ='[email protected] 
 
EXECUTE(@tempSql) 
end
子類: 先建立繼承窗體

學生檢視充值記錄樣圖:
因為充值記錄查詢和上機記錄查詢,僅查詢表不同,所以除了獲取表名需要重寫外,其它都不用再寫。so子窗體只需要寫這一點點程式碼。查詢上機記錄同上。
'**********************************************
'說明:U充值記錄查詢子窗體
'計算機名稱:ZHAOHAN
'建立日期:2015/4/24 16:13:58
'作者:趙寒
'版本號:V2.00
'**********************************************
Public Class frmchkRecharge
    '重獲表名
    Protected Overrides Function GetTable() As String
        Dim tabale As New ChargeEntity.EComQueryParent
        tabale.GetTable = "ReCharge_Info"
        Return tabale.GetTable
    End Function

End Class

總結:

       這樣,通過模板方法,就有了事半功倍的效果,設計模式真的好強大。