模板方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
即:重复度高的窗体,可以用模板方法,比如组合查询。少数的不同之处在父类中定义虚方法,在子类中重写。
分析
一般用户中,充值记录,和上机记录除了查询的表不一样,其它一模一样,所以考虑用模板方法,这样可以达到事半功倍的效果。
详细步骤及代码
父类:新建普通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 '+@datatable+' where CardNo ='+@cardno
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