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

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

相关文章

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停