模板方法模式——【VB.NET机房收费系统(组合查询)】

2024-05-11 01:32

本文主要是介绍模板方法模式——【VB.NET机房收费系统(组合查询)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

友情回顾

                   学习是一个反复的过程……

                    当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,模板方法登场了。个人通俗的理解,模板方法把共同的不变行为抽出(拿出)到一个抽象类,那么子类中的重复代码大大减少,很好的体现了代码复用性。看看模板方法模式的UML


机房收费系统中的模板模式

             主要思路是建立一个空的窗体作为父窗体,而其余有具体执行内容的窗体作为子窗体,这样我们在编码过程中只需要对子窗体中不同执行过程的方法进行重写就可以了。

小编就本人就自己的习惯,展示一下我对机房收费系统的组合查询部分的理解和代码的诠释。(红框中的父类模板窗体)




在父类窗体中的代码,则是我们一贯抽象出的共同部分

'//*******************************************************
'** 作者: 徐露
'** 创始时间:2014-9-1
'** 小组:
'** 完成时间:2014-10-31
'** 描述:个人机房重构
'** 项目说明:   组合查询父类   
'**********************************************************
Imports ChargeSystem.Entity
Imports ChargeSystem.BLL
Public Class from1Public eGroupQuery As New Entity.EGroupQueryPrivate Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.ClickDGV.DataSource = Nothing'组合关系A 为空时If cboRelationA.Text = "" ThenDim arrayControl() As Windows.Forms.ControlReDim Preserve arrayControl(2)arrayControl(0) = cboFieldAarrayControl(1) = cboOperatorAarrayControl(2) = txtContentAIf PublicInfo.IsSomeEmptyText(arrayControl) ThenExit SubEnd IfEnd If'组合关系A 不为空时If cboRelationA.Text <> "" ThenDim arrayControl() As Windows.Forms.ControlReDim Preserve arrayControl(5)arrayControl(0) = cboFieldAarrayControl(1) = cboOperatorAarrayControl(2) = txtContentAarrayControl(3) = cboFieldBarrayControl(4) = cboOperatorBarrayControl(5) = txtContentBIf PublicInfo.IsSomeEmptyText(arrayControl) ThenExit SubEnd IfEnd If'组合关系B 不为空时If cboRelationB.Text <> "" ThenDim arrayControl() As Windows.Forms.ControlReDim Preserve arrayControl(8)arrayControl(0) = cboFieldAarrayControl(1) = cboOperatorAarrayControl(2) = txtContentAarrayControl(3) = cboFieldBarrayControl(4) = cboOperatorBarrayControl(5) = txtContentBarrayControl(6) = cboFieldCarrayControl(7) = cboOperatorCarrayControl(8) = txtContentCIf PublicInfo.IsSomeEmptyText(arrayControl) ThenExit SubEnd IfEnd If'定义一个实体Dim eGroupQuery As New EGroupQueryeGroupQuery.cboFieldA = GetDBName(cboFieldA.Text.Trim)eGroupQuery.cboFieldB = GetDBName(cboFieldB.Text.Trim)eGroupQuery.cboFieldC = GetDBName(cboFieldC.Text.Trim)eGroupQuery.cboOperatorA = cboOperatorA.Text.TrimeGroupQuery.cboOperatorB = cboOperatorB.Text.TrimeGroupQuery.cboOperatorC = cboOperatorC.Text.TrimeGroupQuery.cboRelationA = GetDBName(cboRelationA.Text.Trim)eGroupQuery.cboRelationB = GetDBName(cboRelationB.Text.Trim)eGroupQuery.txtContentA = txtContentA.Text.TrimeGroupQuery.txtContentB = txtContentB.Text.TrimeGroupQuery.txtContentC = txtContentC.Text.TrimeGroupQuery.GetTable = tablename()Dim BGroupQuery As New GroupQueryBLLDim dt As DataTableCall DView(eGroupQuery)End Sub'定义虚函数,获取不同数据库表中的字段名Protected Overridable Function GetDBName(ByVal Str As String) As StringReturn ""End Function'定义虚函数,获取不同数据库表名Protected Overridable Function tablename() As StringReturn ""End FunctionProtected Overridable Sub DView(ByVal eGroupQuery As EGroupQuery)End SubPrivate Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.ClickMe.Close()End SubPrivate Sub cboRelationA_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelationA.SelectedIndexChangedIf cboRelationA.Text <> "" ThencboFieldB.Enabled = TruecboOperatorB.Enabled = TruetxtContentB.Enabled = TruecboRelationB.Enabled = TrueEnd IfEnd SubPrivate Sub cboRelationB_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelationB.SelectedIndexChangedIf cboRelationB.Text <> "" ThencboFieldC.Enabled = TruecboOperatorC.Enabled = TruetxtContentC.Enabled = TrueEnd If       End SubProtected Sub from1_Load(sender As Object, e As EventArgs) Handles MyBase.Load'加载窗体控件的名称eGroupQuery.cboFieldA = ""eGroupQuery.cboFieldB = ""eGroupQuery.cboFieldC = ""cboOperatorA.Items.Add("<")cboOperatorA.Items.Add(">")cboOperatorB.Items.Add("<")cboOperatorB.Items.Add(">")cboOperatorC.Items.Add("<")cboOperatorC.Items.Add(">")cboRelationA.Items.Add("与")cboRelationA.Items.Add("或")cboRelationB.Items.Add("与")cboRelationB.Items.Add("或")cboFieldB.Enabled = FalsecboOperatorB.Enabled = FalsetxtContentB.Enabled = FalsecboRelationB.Enabled = FalsecboFieldC.Enabled = FalsecboOperatorC.Enabled = FalsetxtContentC.Enabled = FalseEnd SubPrivate Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.ClickCall Rdim()If AllEmpty(arrayControl) ThenExit SubEnd IfDGV.DataSource = NothingEnd SubPrivate Sub Rdim()'Dim arrayControl() As Windows.Forms.ControlReDim Preserve arrayControl(9)arrayControl(0) = New Term(txtContentA, "要查询的内容")arrayControl(1) = New Term(txtContentB, "要查询的内容")arrayControl(2) = New Term(txtContentC, "要查询的内容")arrayControl(3) = New Term(cboFieldA, "选择字段")arrayControl(4) = New Term(cboFieldB, "选择字段")arrayControl(5) = New Term(cboFieldC, "选择字段")arrayControl(6) = New Term(cboOperatorA, "选择操作符")arrayControl(7) = New Term(cboOperatorB, "选择操作符")arrayControl(8) = New Term(cboOperatorC, "选择操作符")End Sub
End Class
           这仅仅是UI层中的代码,其他层的代码就不一一展示了,实在还有不理解者大可参考其他人士的代码。与此同理,我们的子类窗体的代码就大大减少了


多看你一眼___建造者模式

           建造者模式(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示)
题外话:在我校食堂和大神吃饭的时候,大神问:看人吃热干面,我也想吃,不知道好不好?我来了一句:那决定与拌热干面的师傅了,他心情好估计就好吃,心情不好的话…咳咳,我就吃了几次,味道不一样的。然后大神说:你说,这不是咱学过的那个设计模式来着?“是……命令?”“是……什么来这……

           就这样小编再次翻开《大话设计模式》,越看越有意思,越看越和模板方法有的一拼

建造者模式同样体现着模板方法,因为Builder类中定义好了ConcreteBuilder必须要重写或要有的方法也就是说Builder中已定义好了要有的方法,这些方法可以在Builder类中实现,也可以把它推迟到子类中实现。模板方法中Abstract2类的重要函数TemplateMethod与建造者模式中的Director类中的函数Build相似,都是定义了方法的执行的骨架。(本内容最好对照《大话设计模式》课本)
           它们究竟还有什么不同呢?小编认为,在实现方法的骨架层次上,建造者模式中使用的是组合的方式,而模板方法模式采用的是继承的方式,我们都知道,组合优于继承,所以我认为建造者更灵活,而且也可以避免由继承而引发的各种问题,如代码膨涨,责任过大,难以维护等。

 

         学习是……相互关联的

 





这篇关于模板方法模式——【VB.NET机房收费系统(组合查询)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978131

相关文章

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤