职责链模式应用——下机(机房重构知识点总结)

下机涉及两个方面,消费时间和消费金额。

对消费时间的处理用的是职责链模式,感觉这个模式用的非常妙,參考的师哥的博客:《机房收费下机中用到的策略与职责链解析》;消费金额的处理用策略模式。针对不同的用户类型。

这里着重介绍职责链的应用。

依据需求,将时间分为三个阶段,准备时间:不收取费用;至少上机时间:大于准备时间,小于至少上机时间的,一律按至少上机时间算。单位递增时间:大于至少上机时间后。按单位递增时间累加。

TimeHandler类,定义一个处理请示的接口

Public MustInherit Class TimeHandlerBLL
    Protected successor As TimeHandlerBLL

    Public Sub SetSuccessor(ByVal successor As TimeHandlerBLL)               '设置继承者
        Me.successor = successor
    End Sub

    Public MustOverride Function HandleTime(ByVal time As Integer) As Integer        '处理请求的抽象方法

End Class

PrepareTimeHandler类。准备时间处理者,处理时间请求,假设能够处理就处理,否则把请求转给继承者

<pre class="vb" name="code">Public Class PrepareTimeHandlerBLL : Inherits TimeHandlerBLL
    Dim preparetime As Integer
    Public Sub New(ByVal esBasicData As List(Of Entity.BasicDataEntity))          '构造函数。传入准备时间的值
        Me.preparetime = CInt(esBasicData(0).PrepareTime)
    End Sub

    Public Overrides Function HandleTime(time As Integer) As Integer      '重写父类函数
        If time <= preparetime Then                  '假设上机时间小于准备时间,返回0
            Return 0
        Else
            Return successor.HandleTime(time)         '否则转到下一位继承者
        End If
    End Function
End Class

LeastTimeHandler类,同理

Public Class LeastTimeHandlerBLL : Inherits TimeHandlerBLL
    Dim leasttime As Integer
    Public Sub New(ByVal esBasicData As List(Of Entity.BasicDataEntity))              '构造函数,传递至少上机时间
        Me.leasttime = CInt(esBasicData(0).LeastTime)
    End Sub
    Public Overrides Function HandleTime(time As Integer) As Integer           '重写父类函数
        If time <= leasttime Then
            Return leasttime                              '假设小于至少上机时间。返回至少上机时间
        Else
            Return successor.HandleTime(time)                    '转到下一位
        End If
    End Function
End Class

StepTimeHandler类。处理剩余的请求

Public Class StepTimeHandlerBLL : Inherits TimeHandlerBLL
    Dim steptime As Integer
    Public Sub New(ByVal esBasicData As List(Of Entity.BasicDataEntity))        '构造函数,传递单位递增时间
        Me.steptime = esBasicData(0).StepTime
    End Sub
    Public Overrides Function HandleTime(time As Integer) As Integer       '大于至少时间。返回实际消费时间
        Return Math.Abs(Int(-time / steptime)) * steptime
    End Function
End Class

Math.Abs(Int(-time / steptime)) * steptime 这个地方看不明确的,參见博客:《史上最简洁的向上取整

由于我这些代码写在B层,须要从U层调用。而參数须要通过实体来传递,所以添加一个类,在B层实例化类,既达到传实体的须要。又减少了U层与B层的耦合。

Public Class OnlineTimeBLL
    ''' <summary>
    ''' 上机时间处理------上下机
    ''' </summary>
    ''' <param name="esBasicData">BasicDataEntity实体</param>
    ''' <param name="eOnlineRecord">OnlineRecordEntiry实体</param>
    ''' <returns>OnlineRecordEntiry实体</returns>
    ''' <remarks>刘晓春 2014年6月26日</remarks>
    Public Function CostTime(ByVal esBasicData As List(Of Entity.BasicDataEntity), eOnlineRecord As Entity.OnlineRecordEntiry)
        '实例化类,通过构造函数,传递參数
        Dim bPrepareTime As New BLL.PrepareTimeHandlerBLL(esBasicData)
        Dim bLeastTime As New BLL.LeastTimeHandlerBLL(esBasicData)
        Dim bStepTime As New BLL.StepTimeHandlerBLL(esBasicData)

        bPrepareTime.SetSuccessor(bLeastTime)                 '设置职责链继承者
        bLeastTime.SetSuccessor(bStepTime)

        Dim time As Integer                          '计算上下机时间差
        time = DateDiff("n", eOnlineRecord.OnTime, eOnlineRecord.OffTime) + DateDiff("n", eOnlineRecord.OnDate, eOnlineRecord.OffDate)

        eOnlineRecord.CostTime = bPrepareTime.HandleTime(time)           '职责链处理,返回消费时间

        Return eOnlineRecord
    End Function
End Class

DateDiff("n", eOnlineRecord.OnTime, eOnlineRecord.OffTime) + DateDiff("n", eOnlineRecord.OnDate, eOnlineRecord.OffDate)  这里分别计算日期和时间的差,然后求和,经測试。小的时间减大的时间会得出负值。再和日期得出的值相加,准确可靠。

然后是U层调用的代码:

        Dim eOnlineRecord As New Entity.OnlineRecordEntiry          '上机记录实体,传递上下机时间
        eOnlineRecord.CardNo = esOnline(0).CardNo
        eOnlineRecord.OnDate = esOnline(0).OnDate
        eOnlineRecord.OnTime = esOnline(0).OnTime
        eOnlineRecord.OffDate = Format(DateTime.Now, "yyyy/MM/dd")
        eOnlineRecord.OffTime = Format(DateTime.Now, "HH:mm:ss")

        Dim bOnlineTime As New BLL.OnlineTimeBLL
        eOnlineRecord = bOnlineTime.CostTime(esBasicData, eOnlineRecord)    '调用函数。传递实体

关于日期时间的格式。也须要我们特别注意,这里有篇博客不错。大家有须要的能够參考下:《VB.net中时间和日期的格式化

职责链的应用到此就结束了,初学设计模式。有什么不正确的地方,欢迎大家批评指正。

时间: 2025-01-01 04:52:05

职责链模式应用——下机(机房重构知识点总结)的相关文章

设计模式(19)---职责链模式

一.定义 职责链模式:使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 解释:简单来说应该是对于一个请求,不同的人根据自己职责范围对它进行处理,同时也因为它一般是从底层向上层传递的请求的,所以将处理该请求的不同的对象比喻成一个链,从相对“低”的地方传递到相对“高”的地方,从而完成请求操作. 二.UML类图及基本代码 基本代码: abstract class Handler { protected H

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

职责链模式+策略模式+反射+配置文件,完美实现下机操作(一)

纵观机房收费系统,逻辑最复杂的也就是下机操作了,这几天一直在考虑下机操作该如何进行. 流程分析: 判断卡号是否存在与是否上机 上机时间的处理 根据时间计算消费金额 更新余额,添加记录 关于逻辑的操作主要集中在两个计算上面时间和金额.首先说上机时间的处理问题,做之前我看了下第一版机房收费系统关于下机的操作: '计算消费时间 TxtTime.Text =DateDiff("n", Trim(TxtOntime.Text), Trim(Offtime)) TxtTime.Text = Txt

机房合作之职责链模式

经过好玩又有趣的软考备战和考试之后,终究还是要归于平静的.我们要学得东西还有很多,于是在软考结束的第二天,机房合作就马上提上了议事日程.在刚开始的时候,是一边做着新闻发布系统,一边思考合作的事宜,到了后来,逐步的过渡全身心投入机房合作的项目中去的阶段,因为我是项目组长,必须要做很多的工作,从一开始的建模到文档编写,再到敲代码,都要涉及,今天我们来讨论讨论如何在机房收费系统的费用计算上使用职责链模式. 首先我们要给出解决方案的类图 职责链模式无非就是把所有的处理对象,通过SetSuccessor(

VB.NET &amp; 职责链模式

前几天一直在讲设计模式,在和师哥师姐的讨论过程中,发现能在机房收费个人重构版中用到好几个设计模式,首先来讨论讨论职责链模式: 首先当看见这个模式的第一眼就觉得这是一个很简单的模式,可是当使用起来真的得考虑许多,首先要明白什么是链?链是一系列节点的集合,可以灵活拆分再重组.这也是与 链表不同的地方,用户可以去访问节点中的任何一点作为开始节点. 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 举

状态模式与职责链模式

在学习设计模式的时候发现状态模式与职责链模式特别的相似,当时没有能理解,现在回过头来看了看,查 了查资料,明白了一点,先把自己的理解写下来,在以后的学习继续深入学习 一.状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 类图 Context类就是用户当前定义的一个状态,而抽象状态类State就是用来解决特定状态的方法,其下有很 多的子类会针对用户定义的状态不同而选择不同的子类方法:可以说抽象类State是解决Context类的方法, 它的子类是针对不同的状态而分成

【学习笔记javascript设计模式与开发实践(职责链模式)----13】 http://blog.csdn.net/pigpigpig4587/article/details/50442406#t0

第13章 职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止. 职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点, 13.1 现实中的职责链模式 职责链模式的例子在现实中并不难找到,以下就是两个常见的跟职责链模式有关的场景. o  如果早高峰能顺利挤上公交车的话,那么估计这

深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦.这就是职责链模式的模式动机. 模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个

组合查询(机房重构知识点总结)

历经n多天,组合查询模板终于做完了,总结一下这几天的成果,和大家一起学习交流. 先看一下父窗体的关键代码: 父窗体代码: Public Class frmComboQuery Protected Overridable Sub frmComboQuery_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim ComboxArray(4) As ComboBox '定义控件数组,获取组合框 ComboxArray(0) = c