您的位置:首页 > 其它

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

2015-05-03 22:04 471 查看

     前言

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

   基本概念

  职责连模式:是多个对象都有机会处理请求,从而避免请求的发送者和接受着之间的耦合关系,将这个对象练成一条链,并沿着这条连传递请求,直到有一个对象处理它为止。
  举例:当我们在提高班请假的时候,如果我们请假的时间不超过两个小时,我们就可以将申请直接提交给纪委,纪委就可以直接处理,但是当我们请假的时间超过两个小时,我们就必须反映到米老师哪,米老师才能处理这个事情,纪委就不能处理。这就一级级的向上走,直到这个请求被处理才结束。

   基本结构图

        


  机房实例

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

  基本类图

    


  基本代码实现

 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层的机会,在实现的过程中对设计模式又有了更深的认识,并且对泛型的学习更为深入,在自己重构的时候没有怎么用到泛型,知识在系统做完以后,在个别功能上面添加了泛型。但是在这此合作中我们都是用的泛型。总之在这个过程中学到了很多,我们并且自始至终都非常快乐,积极!!可以说自己的第一个合作项目顺利结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: