在做机房组合查询这块是,有伙伴们说用模板方法去实现,十分好用,代码也简单。下面是模板方法
定义:模板方法定义了算法的大概骨架,把一些细节的可变部分移交给子类。从而简化代码,使代码完美复用。
我认为:模板方法就是定义了实现一个功能的大概流程,而这个功能和其他的功能有很多的类似点,仅有少许部分是变化的,那么就可以把那些不变化的部分给封装了在父类里,可变化的部分用虚方法定义,在子类里面去实现。举一个生活的小例子:我们现在要实现两个过程:炒白菜和炒土豆。先假设他们的炒法一模一样,那么实现炒菜这个方法就是公共部分,这部分直接塞进父类里面。而切土豆和切白菜是可变部分,直接把这部分在父类里写一个虚方法,让子类根据实际需求去实现。这样模板方法就实现了。充分使代码得到复用,放在一个大的功能里就大大减少了代码量。
看类图:
下面这是机房内的模板方法的类图,里面有三个子窗体,一个父窗体。看类图:
代码展示:直接把不变部分封装到父窗体里,private,可变部分通过一个虚方法承载,子类来实现。
'检测是否为空。
If cobFeild1.Text.Trim = "" Or cobOper1.Text.Trim = "" Or group.txtword1 = "" Then
Dim list As New List(Of Medol.WorkRecordInfo)
dgvResult.DataSource = list
MsgBox("第一行查询条件不能为空!", MsgBoxStyle.OkOnly, "提示")
Exit Sub
End If
If cobRelation.Text.Trim <> "" Then
If cobFeild2.Text.Trim = "" Or cobOper2.Text.Trim = "" Or group.txtword2 = "" Then
Dim list As New List(Of Medol.WorkRecordInfo)
dgvResult.DataSource = list
MsgBox("第二行查询条件不能为空!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "提示")
Exit Sub
End If
End If
If cobRelation2.Text.Trim <> "" Then
If cobFeild3.Text.Trim = "" Or cobOper3.Text.Trim = "" Or group.txtword3 = "" Then
Dim list As New List(Of Medol.WorkRecordInfo)
dgvResult.DataSource = list
MsgBox("第三行查询条件不能为空!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "提示")
Exit Sub
End If
End If
'******************************************************************************************
'为组合查询D层代码传入的实体赋值,模板方法的可变部分。
group.table = gettable() 'gettable() 方法,获得表名的方法
group.FieldName1 = setStr(cobFeild1.Text.Trim) '转换字符串为D层接受的字段
group.FieldName2 = setStr(cobFeild2.Text.Trim)
group.FieldName3 = setStr(cobFeild3.Text.Trim)
group.Opertor1 = cobOper1.Text.Trim
group.Opertor2 = cobOper2.Text.Trim
group.Opertor3 = cobOper3.Text.Trim
group.relation1 = setStr(cobRelation.Text.Trim)
group.relation2 = setStr(cobRelation2.Text.Trim)
print(group) '显示数据方法
总结:最开始难的部分就是父类窗体的构建,如何分清可变部分与不变部分是关键,在选用恰当的方式来对可变部分封装为一个虚方法这就是模板方法了,建立一个父类窗体就Ok了。不过在使用继承的窗体时会发生各种错误,另外建立子类窗体后,然后又对父类窗体修改,一定要生成解决方案,因为修改父窗体后子类窗体也会发生改变,一定要生成解决方案。虽说是设计模式,但是确实面向对象的优点啊。机房里使用模板方法后,代码就直接复用了,大大减少了代码量,再也不用像第一次那样的复制粘贴了。逐渐走入面向对象的世界了。在实现模板方法后,调试了一遍,发现代码跳来跳去的非常有趣。