模版方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。在机房收费系统中我们需要重复使用组合查询多次。对于窗体也可以使用模版方法。通过创建一个父窗体,使用子窗体来继承父窗体来完成模版方法的使用。
特点:
1. 模版方法提供一个很好的代码复用平台,通过不变的行为搬到超类,去除子类中重复代码来体现它的优势。
2. 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模版方法就把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为纠缠。
下面说一下我在组合查询中使用的模版方法:
1. 创建父窗体如图:
2. 创建子窗体,让子窗体继承父窗体(选择我们正确的窗体)
3. 在父窗体中写我们代码复用的部分(也就是我们查询的click 事件)
4. 子窗体我们重写查询的字段名称
具体代码如下:
''' <summary>
'''组合查询的父窗体 能够重写的answer 方法和 能够重写的GetTable 方法
''' </summary>
''' <remarks></remarks>
PublicClassfrmGroupQuery
''' <summary>
''' 点击查询 按钮
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
PrivateSub btnOK_Click(sender AsObject, e AsEventArgs) Handles btnOK.Click
'使用前先滞空控件中的信息
DataGridView.DataSource = Nothing
Dim Fline AsNew Facade.FLine
'组合关系
Dim Cmp As Entity.GroupEntity() = {NewGroupEntity, NewGroupEntity, NewGroupEntity}
Cmp(0).Cmp = answer(cmbField1.Text)
Cmp(1).Cmp = answer(cmbField2.Text)
'运算关系
Dim Ope As Entity.GroupEntity() = {NewGroupEntity, NewGroupEntity, NewGroupEntity}
Ope(0).Ope = cmbOperate1.Text
Ope(1).Ope = cmbOperate2.Text
Ope(2).Ope = cmbOperate3.Text
'查询内容
Dim Cnt As Entity.GroupEntity() = {NewGroupEntity, NewGroupEntity, NewGroupEntity}
Cnt(0).Cnt = Trim(txtContent1.Text)
Cnt(1).Cnt = Trim(txtContent2.Text)
Cnt(2).Cnt = Trim(txtContent3.Text)
'字段名
Dim title As Entity.GroupEntity() = {NewGroupEntity, NewGroupEntity, NewGroupEntity}
title(0).Name = answer(cmbField1.Text)
title(1).Name = answer(cmbField2.Text)
title(2).Name = answer(cmbField3.Text)
Try
Dim dt AsDataTable
dt = Fline.FStatQuery(Cmp, Ope, Cnt, title)
DataGridView.DataSource = dt
Catch ex AsException
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
EndTry
EndSub
''' <summary>
''' answer方法 使子窗体能够重写该方法,来改变cmbbox控件的文本信息
''' </summary>
''' <param name="GetResult"></param>
''' <returns></returns>
''' <remarks></remarks>
ProtectedOverridableFunction answer(ByVal GetResult AsString) AsString
ReturnNothing
EndFunction
ProtectedOverridableFunction GetTable() AsString
ReturnNothing
EndFunction
对于子窗体,我们需要冲洗answer方法和GertTable方法
''' <summary>
''' 子窗体, 窗体加载新的字段名, 重写answer和GetTable 方法
''' </summary>
''' <remarks></remarks>
PublicClassfrmStatQuery
PrivateSub frmStatQuery_Load(sender AsObject, e AsEventArgs) HandlesMyBase.Load
'给组合框赋值
cmbField1.Items.Add("") '字段1添加空集合
cmbField1.Items.Add("卡号") '字段1添加卡号字段
cmbField1.Items.Add("姓名") '字段1添加姓名字段
cmbField1.Items.Add("上机日期") '字段1添加上机日期字段
cmbField1.Items.Add("上机时间") '字段1添加上机时间字段
cmbField1.Items.Add("下机日期") '字段1添加下机日期字段
cmbField1.Items.Add("消费金额") '字段1添加消费金额字段
cmbField1.Items.Add("余额") '字段1添加余额字段
cmbField2.Items.Add("") '字段2添加空集合
cmbField2.Items.Add("卡号") '字段2添加卡号字段
cmbField2.Items.Add("姓名") '字段2添加姓名字段
cmbField2.Items.Add("上机日期") '字段2添加上机日期字段
cmbField2.Items.Add("上机时间") '字段2添加上机时间字段
cmbField2.Items.Add("下机日期") '字段2添加下机日期字段
cmbField2.Items.Add("消费金额") '字段2添加消费金额字段
cmbField2.Items.Add("余额") '字段添加余额字段
cmbField3.Items.Add("") '字段3添加空集合
cmbField3.Items.Add("卡号") '字段3添加卡号字段
cmbField3.Items.Add("姓名") '字段3添加姓名字段
cmbField3.Items.Add("上机日期") '字段3添加上机日期字段
cmbField3.Items.Add("上机时间") '字段3添加上机时间字段
cmbField3.Items.Add("下机日期") '字段3添加下机日期字段
cmbField3.Items.Add("消费金额") '字段3添加消费金额字段
cmbField3.Items.Add("余额") '字段3添加余额字段
EndSub
ProtectedOverridesFunction answer(GetResult AsString) AsString
SelectCase GetResult
Case"卡号"
Return""
Case"姓名"
Return""
Case"上机日期"
Return""
Case"下机日期"
Return""
Case"消费金额"
Return""
Case"余额"
Return""
Case"或"
Return"or"
Case"与"
Return"and"
Case Else
Return""
EndSelect
EndFunction
ProtectedOverridesFunction GetTable() AsString
'数据库的表名称~~~
Return""
EndFunction
EndClass
采用模版方法有效的增加了代码的复用性,减少了冗余。最重要的一点,能够把我们所学的知识应用到机房收费系统中,达到学以致用。真正的应用知识。