机房重构--模板方法

使用场景

组合查询在软件系统应用很广泛。当我们在漫步在淘宝街上的时候,是曾想过我们如何才能准确的找到自己想要的东西呢?----------组合查询来帮忙

在机房收费系统中,组合查询的应用是在操作员的功能下,其主要目的就是便于我们查找一些满足不同条件下的结果,但是当这三个功能基本上相同的,那么大量的代码重复必然不是好事,这里就引入了模板方法。

模板方法:定义了一个操作中的算法的骨架,把一些步骤延迟到子类当中。它使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。它提供了一个代码复用的平台,消除代码冗余带来的弊端,使系统更易于维护。

操作步骤:

1、建立模板父窗体


代码如下

<strong>Imports LoginEntity
Imports Facade
Public Class frmGroupQuery
    Protected enGroupQuery As New GroupeQueryEntity
    Private Sub frmGroupQuery_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '将参数传递给实体,赋初值
        '因为不同窗体字段不同,所以赋"",子窗体重写它
        enGroupQuery.cboName1 = ""
        enGroupQuery.cboName2 = ""
        enGroupQuery.cboName3 = ""

        '操作符
        cboMark1.Items.Add(">")
        cboMark1.Items.Add("<")
        cboMark1.Items.Add("=")
        cboMark1.Items.Add("<>")

        cboMark2.Items.Add(">")
        cboMark2.Items.Add("<")
        cboMark2.Items.Add("=")
        cboMark2.Items.Add("<>")

        cboMark3.Items.Add(">")
        cboMark3.Items.Add("<")
        cboMark3.Items.Add("=")
        cboMark3.Items.Add("<>")

        '关系  
        cboRelation1.Items.Add("与")
        cboRelation1.Items.Add("或")

        cboRelation2.Items.Add("与")
        cboRelation2.Items.Add("或")

        '窗体加载后,后两组控件默认不可用  
        cboName2.Enabled = False
        cboName3.Enabled = False
        cboMark2.Enabled = False
        cboMark3.Enabled = False

        cboRelation2.Enabled = False
        txtContent2.Enabled = False
        txtContent3.Enabled = False

        '设置选中单元格就选中行  
        dgvRecord.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        Dim i As Integer

        For i = 0 To dgvRecord.Columns.Count - 1
            dgvRecord.Columns(i).Width = DataGridViewAutoSizeColumnsMode.AllCells
        Next

    End Sub

    Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
        If cboRelation1.Text = "" Then
            If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Then
                MsgBox("第一行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
                Exit Sub
            End If
        End If

        If cboRelation1.Text <> "" Then
            If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Or
                cboName2.Text = "" Or cboMark2.Text = "" Or txtContent2.Text = "" Then
                MsgBox("第二行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
                Exit Sub
            End If
        Else
            If cboRelation2.Text <> "" Then
                If cboName1.Text = "" Or cboMark1.Text = "" Or txtContent1.Text = "" Or
                cboName2.Text = "" Or cboMark2.Text = "" Or txtContent2.Text = "" Or
                cboName3.Text = "" Or cboMark3.Text = "" Or txtContent3.Text = "" Then

                    MsgBox("第三行查询条件不能为空,请完善查询信息!", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
                    Exit Sub
                End If

            End If

        End If



        '将参数传给实体  
        enGroupQuery.dbName = GetdbName()
        enGroupQuery.cboName1 = ToEnglish(cboName1.Text)
        enGroupQuery.cboName2 = ToEnglish(cboName2.Text)
        enGroupQuery.cboName3 = ToEnglish(cboName3.Text)

        enGroupQuery.cboMark1 = cboMark1.Text.Trim
        enGroupQuery.cboMark2 = cboMark2.Text.Trim
        enGroupQuery.cboMark3 = cboMark3.Text.Trim

        enGroupQuery.txtContent1 = txtContent1.Text.Trim
        enGroupQuery.txtContent2 = txtContent2.Text.Trim
        enGroupQuery.txtContent3 = txtContent3.Text.Trim
        ''前者还是后者  
        enGroupQuery.cboRelation1 = ToEnglish(cboRelation1.Text)
        enGroupQuery.cboRelation2 = ToEnglish(cboRelation2.Text)


        Dim GroupQueryFacade As New GroupQueryFacade   '实例化外观层
        Dim dt As New DataTable
        dt = GroupQueryFacade.GroupCheck(enGroupQuery)
        If dt Is Nothing Then
            MsgBox("该条件下没有记录")
        Else
            Call Todgv()
        End If
    End Sub
    Public Overridable Function ToEnglish(cboName As String) As String
        Return ""
    End Function
    ''' <summary>  
    ''' 获得数据库表名  
    ''' </summary>  
    ''' <returns></returns>  
    ''' <remarks></remarks>  
    Protected Overridable Function GetdbName() As String
        Return ""
    End Function
    ''' <summary>  
    ''' 把表显示到datagridview中  
    ''' </summary>  
    ''' <remarks></remarks>  
    Protected Overridable Sub Todgv()
    End Sub
    Public Function Query(frm As frmGroupQuery) As String
        Dim cmdText As String = "" & frm.ToEnglish(frm.cboName1.Text) & frm.cboMark1.Text & "'" & frm.txtContent1.Text & "'"
        '非组合查询  
        If frm.cboRelation1.Text = "" Then
            cmdText = cmdText
        Else
            '关系1为空,关系2不为空  
            If frm.cboRelation1.Text <> "" Then
                cmdText = cmdText & frm.ToEnglish(frm.cboRelation1.Text) & "" &
                    frm.ToEnglish(frm.cboName2.Text) & frm.cboMark2.Text & "'" & frm.txtContent2.Text & "'"
            Else
                '关系1、2 都不为空  
                cmdText = cmdText & frm.ToEnglish(frm.cboRelation1.Text) & "" &
                    frm.ToEnglish(frm.cboName2.Text) & frm.cboMark2.Text & "'" & frm.txtContent2.Text & "'" & "" &
                    frm.ToEnglish(frm.cboRelation2.Text) & "" &
                    frm.ToEnglish(frm.cboName3.Text) & frm.cboMark3.Text & "'" & frm.txtContent2.Text & "'"
            End If
        End If
        Return cmdText
    End Function

    ''' <summary>  
    ''' 第一个组合关系不为空  
    ''' </summary>  
    ''' <param name="sender"></param>  
    ''' <param name="e"></param>  
    ''' <remarks></remarks>  
    Protected Sub cboRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation1.SelectedIndexChanged
        If cboRelation1.Text = "" Then
            cboName2.Enabled = False
            cboName3.Enabled = False
            cboMark2.Enabled = False
            cboMark3.Enabled = False

            cboRelation2.Enabled = False
            txtContent2.Enabled = False
            txtContent3.Enabled = False
        Else
            cboName2.Enabled = True
            cboMark2.Enabled = True
            cboRelation2.Enabled = True
            txtContent2.Enabled = True
        End If
    End Sub


    ''' <summary>  
    ''' 第二个组合关系不为空  
    ''' </summary>  
    ''' <param name="sender"></param>  
    ''' <param name="e"></param>  
    ''' <remarks></remarks>  
    Protected Sub cboRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation2.SelectedIndexChanged
        If cboRelation2.Text = "" Then
            cboName3.Enabled = False
            cboMark3.Enabled = False
            txtContent3.Enabled = False
        Else
            cboName3.Enabled = True
            cboMark3.Enabled = True
            txtContent3.Enabled = True
        End If
    End Sub
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Me.Close()
    End Sub
End Class</strong>

2、建立子窗体


单机添加


选择自己需要继承的父窗体

3、以学生上机统计信息查询为例

代码如下

<strong>Imports LoginEntity
Imports LoginBLL
Imports Facade
Public Class FrmOperateStatistics
    Private Sub frmOperateStatistics_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboName1.Items.Add("序列号")
        cboName1.Items.Add("卡号")
        cboName1.Items.Add("姓名")
        cboName1.Items.Add("上机日期时间")
        cboName1.Items.Add("下机日期时间")
        cboName1.Items.Add("消费时间")
        cboName1.Items.Add("消费金额")
        cboName1.Items.Add("机器号")
        cboName1.Items.Add("状态")


        cboName2.Items.Add("序列号")
        cboName2.Items.Add("卡号")
        cboName2.Items.Add("姓名")
        cboName2.Items.Add("上机日期时间")
        cboName2.Items.Add("下机日期时间")
        cboName2.Items.Add("消费时间")
        cboName2.Items.Add("消费金额")
        cboName2.Items.Add("机器号")
        cboName2.Items.Add("状态")

        cboName3.Items.Add("序列号")
        cboName3.Items.Add("卡号")
        cboName3.Items.Add("姓名")
        cboName3.Items.Add("上机日期时间")
        cboName3.Items.Add("下机日期时间")
        cboName3.Items.Add("消费时间")
        cboName3.Items.Add("消费金额")
        cboName3.Items.Add("机器号")
        cboName3.Items.Add("状态")
    End Sub

    ''' <summary>  
    ''' 把加载的汉字转换成数据库的字段  
    ''' </summary>  
    ''' <param name="cboName"></param>  
    ''' <returns></returns>  
    ''' <remarks></remarks>  
    Public Overrides Function ToEnglish(cboName As String) As String
        Select Case cboName
            Case "序列号"
                ToEnglish = "series"
            Case "卡号"
                ToEnglish = "cardno"
            Case "上机日期时间"
                ToEnglish = "OnlineDateTime"
            Case "下机日期时间"
                ToEnglish = "OutlineDateTime"
            Case "消费时间"
                ToEnglish = "ConsumeTime"
            Case "消费金额"
                ToEnglish = "ConsumeCash"
            Case "机器号"
                ToEnglish = "Computer"
            Case "状态"
                ToEnglish = "status"
            Case "与"
                ToEnglish = "and"
            Case "或"
                ToEnglish = "or"
            Case Else
                ToEnglish = ""
        End Select
    End Function

    ''' <summary>  
    ''' 传数据库表名  
    ''' </summary>  
    ''' <returns></returns>  
    ''' <remarks></remarks>  
    Protected Overrides Function GetdbName() As String
        Return "T_line"    '组合查询的视图(卡表+学生表)
    End Function

    ''' <summary>  
    ''' 把数据显示到datagridview中  
    ''' </summary>  
    ''' <remarks></remarks>  
    Protected Overrides Sub Todgv()
        Dim dt As New DataTable
        Dim frmGropQuery As New frmGroupQuery
        Dim GroupQueryFacade As New GroupQueryFacade

        Try
            dt = GroupQueryFacade.GroupCheck(enGroupQuery)

            If dt.Rows.Count = 0 Then
                dt.Clear()
                dgvRecord.DataSource = Nothing
                dgvRecord.Refresh()
            Else
                dgvRecord.DataSource = dt
                dgvRecord.Columns(0).Visible = False
                dgvRecord.Columns(0).HeaderText = "序列号"
                dgvRecord.Columns(1).HeaderText = "卡号"
                dgvRecord.Columns(2).HeaderText = "上机日期时间"
                dgvRecord.Columns(3).HeaderText = "下机日期时间"
                dgvRecord.Columns(4).HeaderText = "消费时间"
                dgvRecord.Columns(5).HeaderText = "消费金额"
                dgvRecord.Columns(6).HeaderText = "机器号"
                dgvRecord.Columns(7).HeaderText = "状态"

            End If
        Catch ex As Exception
            MsgBox(ex.Message, vbOKOnly, "提示")
        End Try
    End Sub
End Class
</strong>
其余的窗体也是这个步骤,模板方法减少了大量代码量,提高了效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值