1.前提

1.模板方法模式

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.组合方法

之前写过一篇博客,讲述实现任意组合查询。中心思想:将所有的查询都看做一种情况来处理(http://blog.csdn.net/lypf19900912/article/details/8959245)

3.三层架构

用户界面表示层(UL);业务逻辑层(BLL);数据访问层(DAL)

2.目的

利用模板方法来实现组合查询

3.分析

组合查询在机房收费系统中出现了很多次。他们的界面如图:

实现组合查询的过程也很类似,他们对条件进行组合然后进行查询。细分一下他们实现的相同点和不同点
相同点:选择的条件 拼接成的字符串;不同点:字段的具体内容
       那么对于这个组合查询来说实现的步骤是不变的(选择条件然后拼接字符串),但是实现某些步骤的具体实现是不同的(字段的具体内容不同)。

4.实现

在BLL层建立一个抽象类和他的子类。
抽象类中有一个虚方法:选择的字段(不同点)

四个实方法:选择的操作符,选择的内容,选择的组合关系,拼接字符串

Imports CooperateJF.Entity
Imports CooperateJF.Factory
Imports CooperateJF.IDALNamespace BLL''' <summary>''' 建立组合查询的抽象类''' </summary>Public MustInherit Class CombinCheckBLL''' <summary>''' 组合方法''' 完成字段的拼接''' </summary> ''' <param name="enGroupOne">第一条组合''' 传递三条字段信息</param>Public Function Combin(ByVal enGroupOne As GroupEntity, ByVal enGrouptwo As GroupEntity, ByVal enGroupthree As GroupEntity, ByVal enGroupfour As GroupEntity) As String'拼接字符串Dim strCombin As StringstrCombin = enGroupOne.FileNameOne + enGrouptwo.OperatorOne + enGroupthree.ContextOne + " " + enGroupfour.RelationOne + " " + enGroupOne.FileNameTwo + enGrouptwo.OperatorTwo + enGroupthree.ContextTwo + " " + enGroupfour.RelationTwo + " " + enGroupOne.FileNameThree + enGrouptwo.OperatorThree + enGroupthree.ContextThreeReturn strCombinEnd Function''' <summary>''' 将三个操作符都选择出来''' 这里需要注意的是:不是每次都选择三个,所以需要在方法中为操作符选择默认值(字段如果没有被选择则默认是=)''' </summary>''' <param name="filethree">第三个选择的操作符</param>''' <param name="filetwo">第二个选择的操作符</param>''' <param name="fileone">第一个选择的操作符</param>Public MustOverride Function SelectFile(ByVal filethree As String, ByVal filetwo As String, ByVal fileone As String) As GroupEntityPublic Function SelectOeprator(ByVal Oepratorthree As String, ByVal Oepratortwo As String, ByVal Oepratorone As String) As GroupEntity'定义实体类Dim enGroup As New Entity.GroupEntity'第一个选择操作符Select Case Oepratorone'如果没有选择那么设置默认值是“=”Case ""enGroup.OperatorOne = "="Case ElseenGroup.OperatorOne = OepratoroneEnd Select'第二个选择的操作符Select Case OepratortwoCase ""enGroup.OperatorTwo = "="Case ElseenGroup.OperatorTwo = OepratortwoEnd Select'第三个选择的操作符Select Case OepratorthreeCase ""enGroup.OperatorThree = "="Case ElseenGroup.OperatorThree = OepratorthreeEnd SelectReturn enGroupEnd Function''' <summary>''' 将三个操作符都选择出来''' 这里需要注意的是:不是每次都选择三个,所以需要在方法中为内容选择默认值(内容如果没有被选择则默认是1)''' </summary>''' <param name="Contextthree">第三个选择的内容</param>''' <param name="Contexttwo">第二个选择的内容</param>''' <param name="Contextone">第一个选择的内容</param>Public Function SelectContext(ByVal Contextthree As String, ByVal Contexttwo As String, ByVal Contextone As String) As GroupEntity'定义实体类Dim enGroup As New Entity.GroupEntity'第二个选择的内容Select Case ContextoneCase ""enGroup.ContextOne = " 1 "Case ElseenGroup.ContextOne = ContextoneEnd Select'第二个选择的内容Select Case ContexttwoCase ""enGroup.ContextTwo = "1 "Case ElseenGroup.ContextTwo = ContexttwoEnd Select'第三个选择的内容Select Case ContextthreeCase ""enGroup.ContextThree = "1"Case ElseenGroup.ContextThree = ContextthreeEnd SelectReturn enGroupEnd Function''' <summary>''' 选择组合;如果没有选择默认是and''' </summary>''' <param name="relationtwo">选择的第二种组合</param>''' <param name="relationone">选择的第一种组合</param>Public Function SelectRelation(ByVal relationtwo As String, ByVal relationone As String) As GroupEntity'定义实体类Dim enGroup As New Entity.GroupEntity'选择的第二个组合Select Case relationtwoCase ""enGroup.RelationTwo = "AND"Case "与"enGroup.RelationTwo = "AND"Case "或"enGroup.RelationTwo = "or"End Select'选择的第一个组合Select Case relationoneCase ""enGroup.RelationOne = "AND"Case "与"enGroup.RelationOne = "AND"Case "或"enGroup.RelationOne = "OR"End SelectReturn enGroupEnd FunctionEnd ClassEnd Namespace

子类来实现两个功能的选择字段方法

Imports CooperateJF.Entity
Imports CooperateJF.Factory
Imports CooperateJF.IDALNamespace BLL''' <summary>''' 字段子类''' </summary>Public Class FileBLLInherits BLL.CombinCheckBLL''' <summary>''' 字段选择(默认为1)''' </summary>''' <param name="filethree">选择第三个字段</param>''' <param name="filetwo">选择第二个字段</param>''' <param name="fileone">选择第一个字段</param>Public Overrides Function SelectFile(ByVal filethree As String, ByVal filetwo As String, ByVal fileone As String) As GroupEntity'定义实体类Dim enGroup As New Entity.GroupEntity'选择第一个字段Select Case fileoneCase ""enGroup.FileNameOne = 1Case "学号"enGroup.FileNameOne = "StuID"Case "性别"enGroup.FileNameOne = "StuSex"Case "卡号"enGroup.FileNameOne = "CardID"Case "余额"enGroup.FileNameOne = "Balance"Case "系别"enGroup.FileNameOne = "StuDepartment"Case "专业"enGroup.FileNameOne = "StuMajor"Case "班级"enGroup.FileNameOne = "StuClass"End Select'选择第二个字段Select Case filetwoCase ""enGroup.FileNameTwo = " 1"Case "学号"enGroup.FileNameTwo = " StuID"Case "性别"enGroup.FileNameTwo = " StuSex"Case "卡号"enGroup.FileNameTwo = " CardID"Case "余额"enGroup.FileNameTwo = " Balance"Case "系别"enGroup.FileNameTwo = " StuDepartment"Case "专业"enGroup.FileNameTwo = " StuMajor"Case "班级"enGroup.FileNameTwo = " StuClass"End Select'选择第三个字段Select Case filethreeCase ""enGroup.FileNameThree = " 1"Case "学号"enGroup.FileNameThree = " StuID"Case "性别"enGroup.FileNameThree = " StuSex"Case "卡号"enGroup.FileNameThree = " CardID"Case "余额"enGroup.FileNameThree = " Balance"Case "系别"enGroup.FileNameThree = " StuDepartment"Case "专业"enGroup.FileNameThree = " StuMajor"Case "班级"enGroup.FileNameThree = " StuClass"End SelectReturn enGroupEnd FunctionEnd ClassEnd Namespace

在UI层的调用(主要的部分)

 ''' <summary>''' 确定查看学生基本信息''' </summary>Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click'设置选择的内容Dim enGroupOne As New GroupEntityDim enGroupTwo As New GroupEntityDim enGroupThree As New GroupEntityDim enGroupFour As New GroupEntityDim file As New FileBLL'选择字段enGroupOne = file.SelectFile(cmbFileName3.Text, cmbFileName2.Text, cmbFileName1.Text)'选择操作符enGroupTwo = file.SelectOeprator(cmbOperate3.Text, cmbOperate2.Text, cmbOperate1.Text)'添加的内容enGroupThree = file.SelectContext(txtFileName3.Text, txtFileName2.Text, txtFileName1.Text)'选择的组合关系enGroupFour = file.SelectRelation(cmbRelation1.Text, cmbRelation2.Text)'拼接字段Dim strCombin As StringstrCombin = file.Combin(enGroupOne, enGroupTwo, enGroupThree, enGroupFour)End Sub

模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势的。也就提供了一个很好的代码复用平台。

模板方法模式实现组合查询相关推荐

  1. .NET重构(四):窗体继承+模板方法,完美实现组合查询

    导读:在机房重构中,有好些个查询都是大同小异,最为显著的就是组合查询了.怎样给自己省事儿,相同的东西能不能重复利用,就成了一个现实的问题.第一遍做机房的时候,使用的更多的是:复制+粘贴.学习了设计模式 ...

  2. 继承窗体搭建组合查询模板方法的幸福之家

            窗外寒冬有了春的温暖,过了立春还在北国,总觉得已过春节,实际迟迟未到.         继承窗体做了组合查询与模板方法的红娘,搭建了幸福之间.期盼着春节列车红娘,只想做南方过客的&qu ...

  3. 设计模式(三):模板方法模式、迭代器和组合模式、状态模式

    八.模板方法模式 1.概念 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板就是一个方法,更具体地说 ...

  4. 组合查询(机房重构知识点总结)

    历经n多天.组合查询模板最终做完了,总结一下这几天的成果.和大家一起学习交流. 先看一下父窗口的关键代码: 父窗口代码: Public Class frmComboQueryProtected Ove ...

  5. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

        前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...

  6. 蠡测机房重构之组合查询

    [写在前边的话] 在进行机房重构的过程中,设计组合查询的窗体,真的是学到了很多东西.以管窥豹,以蠡测海,所以想小小的总结一下,缅怀这一寸寸学习的时光. [设计模式之模板方法的运用] 模板方法模式--在 ...

  7. Windows环境下实现设计模式——模板方法模式(JAVA版)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现模板方法模式(设计模式). 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式 ...

  8. 设计模式之模板方法模式(Template Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 模板方法模式与策略模式的区别

    2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

最新文章

  1. Javascript基础知识 - 基础部分
  2. QTP的那些事--web测试脚本不能录制的解决方法(个人整理未完待续)
  3. 邮件 自动打印 linux,Unix / Linux基本实用程序-打印,电子邮件
  4. 1669 DINIC+二分
  5. c++学习笔记之类的应用
  6. linux 64 内存管理,[内存管理]linux X86_64处理器的内存布局图
  7. 软工1816 · Alpha冲刺(9/10)
  8. 转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?
  9. android studio 导入依赖报错——Could not find com.xxx,(# fields: 66338 > 65536)
  10. 机器学习线性回归_机器学习实例--线性回归
  11. 自动化运维环境搭建过程
  12. Android 系统(71)---Android系统build.prop文件生成过程
  13. hadoop下载地址
  14. [转载] 详解 Numpy.ndarray
  15. python日期,时间函数
  16. Remoting例子-使用配置文件
  17. matlab模拟频谱仪,program 本实验要求基于声卡与MATLAB实现音频信号频谱分析仪的设计 联合开发网 - pudn.com...
  18. mysql 主键 sql语句_Mysql主键相关的sql语句集锦
  19. 英语六级 Java_过英语六级算什么,你过了Java25级了吗!
  20. java jframe 设置背景图片_Java怎么给JFrame添加背景图片

热门文章

  1. uniapp sass-loader问题
  2. YottaChain芝麻云服务器打造的区块链存储公链
  3. http://noi.openjudge.cn/ch0107/13/
  4. 如何用计算机模拟光的传播,介质光波导的模式特性及计算机辅助分析的研究
  5. 三观 - 三观 - 三观
  6. 大国消费发起人高翔:未来购物中心将抢滩“白色经济”
  7. word转chm帮助文档最有效方法,支持word超链接
  8. 1、windows下VScode修改PYTHONPATH变量方便导入模块
  9. Python中的浅拷贝与深拷贝
  10. 成人大专计算机专业总结,成人大专毕业自我鉴定范文