策略+简单工厂 实战篇

最后更新于:2022-04-01 09:30:31

机房收费系统收费制度——策略+简单工厂模式 前段时间把设计模式学了个遍,确切的说是初识。因为看过后,脑袋里就只剩下这几个模式叫什么了,怎么用,类图是什么,都不记得了。 现在机房收费系统重构,刚好拿几个过来练练手。 ## 一、策略模式的使用环境 机房收费系统在下机收费这块,涉及到两种卡的收费,一种是固定用户,一种是临时用户。不同的用户消费单价不相同,导致在读取数据库的时候会有两种不同的查询方法,这样的情况适合使用策略模式来解决。(其实这里的情况比较简单,系统小,用模式有点复杂,这里只是为了学习策略模式和简单工厂) ## 二、具体实现 Client 类 ~~~ '计算收费类 '相当于策略模式中的Client '定义收费计算公式 Public Class CalculateConsume '声明实体类——数据表 Dim dataen As New Model.Data_Table '声明实体类对象——消费表 Dim customeren As New Model.Consume_Table '定义dataaccess 类 Dim da As New DataAccess.DataAccess '定义收费频率 Dim frequency As Integer '定义准备时间 Dim timeready As Integer '定义最少上机时间 Dim timemin As Integer '计算公式 '调用ContextConsume类 Public Function CaculateMoney(cardnum As Integer) As Model.Consume_Table '初始化策略模式配置类 Dim conprice As New ContextConsume(cardnum) '调用方法,获取消费单价 Dim unitprice As Integer = conprice.Getresult() '定义消费金额 Dim costmoney As Integer '计算消费金额=单价*消费时长 costmoney = unitprice * Interval(GetOnTime(cardnum)) '把计算结果传值给实体类 customeren.P_cost = costmoney customeren.P_interval = Interval(GetOnTime(cardnum)) '将(下机)现在时间传给实体类 customeren.P_offtime = Format(Now, "hh-nn") Return customeren End Function '获取某个卡的上机时间——被Client 调用 Public Function GetOnTime(cardnnum) As Model.Consume_Table '创建接口 Dim ico As IDAL.IConsume = da.CreateConsume() '调用D层方法,并返回 Return ico.GetPOnTime(cardnnum) End Function '计算消费时长——把实体类当参数传递 Public Function Interval(customeren As Model.Consume_Table) As Long '把读取来的上机时间赋值给日期变量 Dim ondate As Date = Format(CDate(customeren.P_ondate), "mm-dd") Dim ontime As Date = Format(CDate(customeren.P_ontime), "HH-nn") '以当前时间为结束时间 Dim enddate As Date = Format(Now, "mm-dd") Dim endtime As Date = Format(Now, "HH-nn") '调用系统函数 datediff 计算时间间隔 Dim costdate As Long = DateDiff("n", Trim(ondate), Trim(enddate)) Dim costtime As Long = DateDiff("n", Trim(ontime), Trim(endtime)) '调用系统函数cint 四舍五入来求的 时间间隔 '上机时间小于最小上机时间,按30分钟算 If (costdate + costtime) < timemin & (costdate + costtime) > timeready Then Interval = 1 Else '上机时间大于最小上机时间 Interval = CInt((costtime + costdate - timeready) / frequency) End If End Function '取得基本数据表中的数据 Public Function GetData() As Model.Data_Table '创建接口 Dim id As IDAL.IData = da.CreateData() '调用D层方法——取得数据 dataen = id.GetData() '取出收费频率 frequency = dataen.P_frequency '取出最少上机时间 timemin = dataen.P_timemin '取出准备时间 timeready = dataen.P_timeready '返回值 Return dataen End Function End Class ~~~ 策略类中接口 ~~~ '策略模式 '根据用户类型,到数据库中去查询不同的消费价格 '不同的用户,实现查询的语句不同 Public Interface ConsumePrice '读取不同用户的消费价格 Function Getprice() As Integer End Interface ~~~ 配置策略类的context +简单工厂实现 ~~~ '关联策略模式 '实例化策略模式接口 Public Class ContextConsume '声明消费单价类对象——策略模式 Dim cp As IStrategy.ConsumePrice '构造函数,运用简单工厂,根据传入参数确定具体的收费策略 Public Sub New(cardnum As Integer) '根据参数选择实例化对象 Select Case Cardtype(cardnum) Case "临时用户" cp = New TempConsume() Exit Sub Case "固定用户" cp = New RegularConsume() Exit Sub End Select End Sub '根据卡类型,获取收费单价 Public Function Getresult() As Integer '返回具体方法的实现 Return cp.Getprice() End Function '获取卡的类型 Public Function Cardtype(cardnum As Integer) As String '声明dataaccess 类 Dim da As New DataAccess.DataAccess '创建接口 Dim ic As IDAL.ICards = da.CreateCards() '返回值 Return ic.GetCardType(cardnum) End Function End Class ~~~ 实现接口的具体类 ~~~ '获取固定用户的消费单价 Public Class RegularConsume Implements IStrategy.ConsumePrice '获取固定用户的消费单价 Public Function Getprice() As Integer Implements IStrategy.ConsumePrice.Getprice '声明工厂对象 Dim da As New DataAccess.DataAccess '创建接口 Dim id As IDAL.IData = da.CreateData '创建datatable对象 Dim dataen As New Model.Data_Table '调用D层方法实现 dataen = id.GetPriceRegular() '取出需要的值,并返回 Return dataen.P_priceregular End Function End Class ~~~ 临时用户 ~~~ '获取临时用户的消费价格 Public Class TempConsume '实现IStrategy接口 Implements IStrategy.ConsumePrice '获取临时用户的消费价格 Public Function Getprice() As Integer Implements IStrategy.ConsumePrice.Getprice '声明工厂对象 Dim da As New DataAccess.DataAccess '创建接口 Dim id As IDAL.IData = da.CreateData '创建datatable对象 Dim dataen As New Model.Data_Table '调用D层方法实现 dataen = id.GetPriceTemp() '取出需要的值,并返回 Return dataen.P_pricetemp End Function End Class ~~~
';