设计模式——职责链模式实现消费时间计算

简介: 设计模式——职责链模式实现消费时间计算

前言


在这个合作中又尝试使用了新的设计模式,在自己的第一个合作项目中学到了很多,每个人对这个项目都有自己想法,所以我们每一个人都在尝试新的知识,我们也是对于新的想法我们都会加以运用,在计算上机时间的时候,我们的项目中采用了职责连模式,而我正好是负责B层的工作,所以就学习了这个模式,下面就和大家分享一下我的学习。


基本概念



职责连模式:是多个对象都有机会处理请求,从而避免请求的发送者和接受着之间的耦合关系,将这个对象练成一条链,并沿着这条连传递请求,直到有一个对象处理它为止。


举例:当我们在提高班请假的时候,如果我们请假的时间不超过两个小时,我们就可以将申请直接提交给纪委,纪委就可以直接处理,但是当我们请假的时间超过两个小时,我们就必须反映到米老师哪,米老师才能处理这个事情,纪委就不能处理。这就一级级的向上走,直到这个请求被处理才结束。


基本结构图


20150511202024583.png


机房实例


在机房收费系统中,当我们进行下机的时候需要计算消费金额,但是我们在计算的时候需要考虑到,开机准备时间,最少消费时间等,所以我们需要判断我们实际消费的时间和这些时间的关系才能计算出我们上机消费的真正的时间。


基本类图


20150511201929309.png


基本代码实现


TimeCountBLL类:


Public MustInherit Class TimeCountBLL
    '设置继任者(上级)
    Property Successor As TimeCountBLL
    Public Sub SetSuccessor(ByVal Successor As TimeCountBLL)
        Me.Successor = Successor
    End Sub
    '处理请求时间
    Public MustOverride Function HandleTime(ByVal timeCount As Integer) As Integer
End Class ' TimeCountBLL

LittleThanPreTime类:

Public Class LittleThanPreTime : Inherits TimeCountBLL
    Private preparetime As Integer
    ''' <summary>
    ''' 访问后继者
    ''' </summary>
    ''' <param name="timeCount"></param>
    Public Overloads Overrides Function HandleTime(timeCount As Integer) As Integer
        '获取准备时间
        'preparetime = BLL.basicDataSetBLL.basicdata(0).prepareTime
        If timeCount < preparetime Then
            Return 0
        Else
            Return Successor.HandleTime(timeCount)   '转移到最少上机时间
        End If
    End Function
    ''' <summary>
    ''' 构造函数传入准备时间
    ''' </summary>
    ''' <param name="endDataBasic"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal endDataBasic As List(Of Entity.basicdataEntity))
        Me.preparetime = CInt(BLL.basicDataSetBLL.basicdata(0).prepareTime.ToString)
    End Sub
End Class ' LittleThanPreTime

LittleThanLimitTime类:

''' <summary>
''' 大于准备时间小于最少上机时间时
''' </summary>
Public Class LittleThanLimitTime : Inherits TimeCountBLL
    Private leastTime As Integer
    ''' <summary>
    ''' 访问后继者
    ''' </summary>
    ''' <param name="timeCount"></param>
    Public Overrides Function HandleTime(timeCount As Integer) As Integer
        leastTime = CInt(BLL.basicDataSetBLL.basicdata(0).limitTime.ToString)
        If timeCount <= leastTime Then
            Return leastTime
        Else
            Return Successor.HandleTime(timeCount)
        End If
    End Function
    ''' <summary>
    ''' 构造函数获得至少上机时间
    ''' </summary>
    ''' <param name="endDataBasic"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal endDataBasic As List(Of Entity.basicdataEntity))
        Me.leastTime = CInt(BLL.basicDataSetBLL.basicdata(0).limitTime.ToString)
    End Sub
End Class ' LittleThanLimitTime

MoreThanLimitTime类:

''' <summary>
''' 单位递增时间
''' </summary>
Public Class MoreThanLimitTime : Inherits TimeCountBLL
    Private unitTime As Integer
    Public Overrides Function HandleTime(timeCount As Integer) As Integer
        Return timeCount
    End Function
    ''' <summary>
    '''构造函数获取单位递增时间
    ''' </summary>
    ''' <param name="endDataBasic"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal endDataBasic As List(Of Entity.basicdataEntity))
        Me.unitTime = CInt(BLL.basicDataSetBLL.basicdata(0).unitTime.ToString)
    End Sub
End Class ' MoreThanLimitTime

Facade类:

    ''' <summary>
    ''' 计算下机的时候消费的时间
    ''' </summary>
    ''' <param name="onLineTime"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function costTimeCount(ByVal onLineTime As Integer) As Integer
        Dim LittleThanPreTime As New BLL.LittleThanPreTime(BLL.basicDataSetBLL.basicdata)
        Dim MoreThanLimitTime As New BLL.MoreThanLimitTime(BLL.basicDataSetBLL.basicdata)
        Dim LittleThanLimitTime As New BLL.LittleThanLimitTime(BLL.basicDataSetBLL.basicdata)
        '设置上级
        LittleThanPreTime.SetSuccessor(LittleThanLimitTime)
        LittleThanLimitTime.SetSuccessor(MoreThanLimitTime)
        Return LittleThanPreTime.HandleTime(onLineTime)

在设置上级的时候,一定要注意从哪一级开始执行,它的下一级是是谁的问题,在第一变的时候,我在设置上机的时候,前后是同一级别,导致系统进入死循环。


小结


首先感谢组长给这次负责B层的机会,在实现的过程中对设计模式又有了更深的认识,并且对泛型的学习更为深入,在自己重构的时候没有怎么用到泛型,知识在系统做完以后,在个别功能上面添加了泛型。但是在这此合作中我们都是用的泛型。总之在这个过程中学到了很多,我们并且自始至终都非常快乐,积极!!可以说自己的第一个合作项目顺利结束。

目录
相关文章
|
5月前
|
设计模式
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
|
5月前
|
设计模式
二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
|
3月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 职责链模式
js设计模式【详解】—— 职责链模式
72 8
|
4月前
|
设计模式
职责链模式-大话设计模式
职责链模式-大话设计模式
|
4月前
|
设计模式
行为设计模式之职责链模式
行为设计模式之职责链模式
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~职责链模式
[设计模式 Go实现] 行为型~职责链模式
|
设计模式 缓存 Java
行为型设计模式08-职责链模式
行为型设计模式08-职责链模式
35 0
|
5月前
|
设计模式 Java
小谈设计模式(25)—职责链模式
小谈设计模式(25)—职责链模式
|
5月前
|
设计模式 JavaScript
职责链模式--设计模式
职责链模式--设计模式
21 0
|
设计模式
设计模式——职责链模式
设计模式——职责链模式