机房重构---下机(策略模式和职责连模式)

2024-03-27 01:38

本文主要是介绍机房重构---下机(策略模式和职责连模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

下机需要查看消费时间以及选择用户类型,因此这里用到了职责连模式以及策略模式两种模式。消费时间用的是职责连模式,选择用户类型(固定用户,临时用户)。涉及多个表的查询,用视图是个不错的选择。

内容:


一、各个层调用关系:


二、UI层代码:

 Private Sub btnOffLine_Click(sender As Object, e As EventArgs) Handles btnOffLine.Click'1、卡号是否存在 2、卡号是否上机,上机记录表 '3、计算消费金额:1、小于( 最少上机时间和准备时间)2、大于( 最少上机时间和准备时间)小于递增时间 (临时和固定)'4、更新上机记录表,卡表If txtCardNo.Text = "" ThenMsgBox("请输入卡号")ReturnEnd IfDim table1 As New DataTableDim Card As New Entity.EntityCardDim line As New Entity.LineLogEntityDim facade As New Facade.OffLineFacadeDim table2 As New DataTableDim basic As New Entity.EntityBasicDataSetCard.CardNo = txtCardNo.Text()'查询卡表获取卡类型等table1 = facade.selectOffF(Card)'查询基础数据表table2 = facade.selectBasicF(basic)Card.type = table1.Rows(0).Item(3)Card.Balance = table1.Rows(0).Item(2)line.OnDate = table1.Rows(0).Item(1)line.OffDate = Format(Now, "yyyy-MM-dd HH:mm:ss")basic.LeastTime = table2.Rows(0).Item(5)basic.UnitTime = table2.Rows(0).Item(4)basic.ReadyTime = table2.Rows(0).Item(6)basic.tmpRate = table2.Rows(0).Item(3)basic.Rate = table2.Rows(0).Item(2)Dim facade2 As New Facade.CashContext'计算消费时间line.mins = facade.ConsumeTimeF(basic, Card, line)'选择卡类型line.Cash = facade2.SelectType(basic, Card, line)Card.Balance = CDec(Card.Balance) - CDec(line.Cash)line.CardNo = Card.CardNoDim flag As Booleanflag = facade.offLine(line, Card)If flag = True ThenMsgBox("下机成功")txtCardNo.Text = line.CardNotxtBalance.Text = Card.BalancetxtType.Text = Card.typetxtStudentNo.Text = table1.Rows(0).Item(5)txtStudentName.Text = table1.Rows(0).Item(6)txtDepartment.Text = table1.Rows(0).Item(8)txtSex.Text = table1.Rows(0).Item(7)txtOnDate.Text = line.OnDatetxtOffDate.Text = line.OffDatetxtmins.Text = line.minstxtCash.Text = line.CashElseMsgBox("下机失败")End IfEnd Sub

三、外观层

1、职责连查看消费时间

    Public Function ConsumeTimeF(ByVal basic As Entity.EntityBasicDataSet, ByVal card As Entity.EntityCard, ByVal line As Entity.LineLogEntity) As IntegerDim preparetime As New BLL.PrepareTimeBLL(basic)Dim leasttime As New BLL.LeastTimeBLL(basic)Dim unittime As New BLL.UintTimeBLLpreparetime.setsuccessor(leasttime)leasttime.setsuccessor(unittime)Dim time As Integertime = DateDiff("n", line.OnDate, line.OffDate)Return preparetime.TimeRequest(time)End Function

2、策略模式选择卡类型

Public Class CashContextDim cashsuper As CashSuper'根据策略 不同,采用不同的计费方式Public Function SelectType(ByVal basic As Entity.EntityBasicDataSet, ByVal card As Entity.EntityCard, ByVal line As Entity.LineLogEntity) As SingleSelect Case card.type.Trim()Case "固定用户"cashsuper = New FixedUserBLL() '实例化固定用户策略Case "临时用户"cashsuper = New TmpUserBLL()End SelectReturn cashsuper.GetConsumMoney(basic, card, line)End Function


四、BLL层

1、职责连查看消费时间

(1)时间基类

Public MustInherit Class TimeBLLProperty successor As TimeBLLPublic Sub setsuccessor(ByVal successor As TimeBLL) '设置继承类Me.successor = successorEnd Sub'请求处理的抽象方法Public MustOverride Function TimeRequest(ByVal time As Integer) As IntegerEnd Class
(2)LeastTimeBLL类

Public Class LeastTimeBLL : Inherits TimeBLLProtected leastTime As IntegerPublic Sub New(ByVal basic As Entity.EntityBasicDataSet)Me.leastTime = CInt(basic.LeastTime) '将至少上机时间赋值为leastTimeEnd SubPublic Overrides Function TimeRequest(time As Integer) As IntegerIf time <= leastTime Then '如果上机时间小于至少上机时间,返回至少上机时间  Return leastTimeElseReturn successor.TimeRequest(time)End IfEnd Function
End Class
(3)PreparetimeBLL类 
Public Class PrepareTimeBLL : Inherits TimeBLLDim preparetime As Integer' Public Sub New是VB.net默认的构造函数  form_load是Form类在调用New构造函数后加载窗体绘图后才调用的方法 Public Sub New(ByVal basic As Entity.EntityBasicDataSet)Me.preparetime = CInt(basic.ReadyTime)  '传入准备时间End SubPublic Overrides Function TimeRequest(time As Integer) As IntegerIf time <= preparetime Then '如果上机时间小于准备时间,返回0Return 0ElseReturn successor.TimeRequest(time)End IfEnd Function
End Class

(4)Unittime类

Public Class UintTimeBLL : Inherits TimeBLL'正常消费Public Overrides Function TimeRequest(time As Integer) As IntegerReturn timeEnd Function
End Class

2、策略模式选择卡类型:

(1)固定用户

Public Class FixedUserBLL : Inherits CashSuper'固定用户Dim fixedRate As SinglePublic Overrides Function GetConsumMoney(ByVal basic As Entity.EntityBasicDataSet, ByVal card As Entity.EntityCard, ByVal line As Entity.LineLogEntity) As SinglefixedRate = Trim(Int(basic.Rate))Dim consumMoney As SingleconsumMoney = Trim(CSng(fixedRate) * CSng(line.mins * 1.0 / 60.0))If consumMoney < Trim(Int(basic.Rate)) ThenconsumMoney = Int(basic.Rate)End IfReturn consumMoneyEnd Function
End Class
(2)临时用户

Public Class TmpUserBLL : Inherits CashSuper  '临时用户Dim TmpRate As SinglePublic Overrides Function GetConsumMoney(basic As Entity.EntityBasicDataSet, card As Entity.EntityCard, line As Entity.LineLogEntity) As SingleTmpRate = basic.tmpRateDim consumMoney As SingleconsumMoney = Trim(CSng(TmpRate) * CSng(line.mins * 1.0 / 60.0))If consumMoney < Int(basic.tmpRate) ThenconsumMoney = Int(basic.tmpRate)End IfReturn consumMoneyEnd Function
End Class

五、DAL层

Public Class AdcountDAL : Implements IDAL.IAdcountPublic Function update(adcount As EntityAdCount) As Integer Implements IAdcount.updateDim sql As StringDim sqlhelper As New SQLHelper.sqlhelperDim flag As IntegerDim paras As SqlParameter() = {New SqlParameter("@UserID", adcount.UserID),New SqlParameter("@CancelCash", adcount.CancelCash),New SqlParameter("@CheckCash", adcount.CheckCash),New SqlParameter("@RechCash", adcount.RechCash),New SqlParameter("@Checkdate", adcount.Checkdate)}sql = "proc_Account"flag = sqlhelper.ExecAddDelUpdate(sql, CommandType.StoredProcedure, paras)Return flagEnd Function
End Class
存储过程:

ALTER PROCEDURE [dbo].[pro_Offline]@CardNO varchar(20),@OffDate datetime,@mins    int,@Cash    numeric(10, 2),@state  varchar(20),@Balance numeric(10, 2)
AS
BEGINupdate Y_LineLog_Info set OffDate=@OffDate  ,mins =@mins  ,Cash=@Cash ,state=@state where CardNo =@CardNO  update Y_Card_Info set Balance=Balance  where CardNo =@CardNO  END

总结:

下机用到了两个设计模式,其实设计到哪部分特别复杂就该考虑用设计模式去解耦合,设计模式还需要我们继续去研究。

这篇关于机房重构---下机(策略模式和职责连模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架