策略+简单工厂 实战篇
最后更新于: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
~~~