策略+简单工厂 实战篇

 

机房收费系统收费制度——策略+简单工厂模式

前段时间把设计模式学了个遍,确切的说是初识。因为看过后,脑袋里就只剩下这几个模式叫什么了,怎么用,类图是什么,都不记得了。

现在机房收费系统重构,刚好拿几个过来练练手。

一、策略模式的使用环境

机房收费系统在下机收费这块,涉及到两种卡的收费,一种是固定用户,一种是临时用户。不同的用户消费单价不相同,导致在读取数据库的时候会有两种不同的查询方法,这样的情况适合使用策略模式来解决。(其实这里的情况比较简单,系统小,用模式有点复杂,这里只是为了学习策略模式和简单工厂)


二、具体实现

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值