模板方法模式——【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

相关文章

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换