VB.NET & 职责链模式

前几天一直在讲设计模式,在和师哥师姐的讨论过程中,发现能在机房收费个人重构版中用到好几个设计模式,首先来讨论讨论职责链模式:

首先当看见这个模式的第一眼就觉得这是一个很简单的模式,可是当使用起来真的得考虑许多,首先要明白什么是链?链是一系列节点的集合,可以灵活拆分再重组。这也是与 链表不同的地方,用户可以去访问节点中的任何一点作为开始节点。

定义:

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

举例:

现在正在敲个人重构版机房收费系统,在下机的过程中,我们需要和基本数据的设定联系起来,即上机时间是分为三段来考虑的,准备时间,至少上机时间,单位递增时间,在判断处理的时候他则是一次来进行的,这不正与职责链模式不谋而合了吗?参照职责链中涨工资的小故事,我们可以把分成三个类,准备时间,至少上机时间和单位时间

看相关代码:

首先得需要一个抽象类,处理请求的一个接口:

'BL_TimeHandler,抽象类,定义一个处理请求的接口
Public MustInherit Class BL_TimeHandler

    Protected calaulate As BL_TimeHandler

    Public Sub Setcalaulate(ByVal calaulate As BL_TimeHandler)  '设置继承者
        Me.calaulate = calaulate
    End Sub
    '处理请求的抽象方法
    Public MustOverride Function HandleTime(ByVal time As Integer) As Integer

End Class

然后就是三个子类对于父类的继承:

'BL_PrepareTimeHandler,准备时间处理类,继承BL_TimeHandler
Public Class BL_PrepareTimeHandler : Inherits BL_TimeHandler
    Dim preparetime As Integer
    '构造函数,利用泛型集合传入准备时间的值
    Public Sub New(ByVal EnBasicdata As IList(Of Entity.BasicDataEntity))
        Me.preparetime = CInt(EnBasicdata(0).prepareTime)  '返回表达式
    End Sub

    Public Overrides Function HandleTime(time As Integer) As Integer
        If time <= preparetime Then   '如果上机时间<准备时间,返回0
            Return 0
        Else
            Return calaulate.HandleTime(time)    '转到下一位继承者
        End If
    End Function
End Class
'BL_unitTimeHandler,单位时间处理类
Public Class BL_unitTimeHandler : Inherits BL_TimeHandler
    Private unittime As Integer
    '构造函数,传入递增时间
    Public Sub New(ByVal enBasicdata As IList(Of Entity.BasicDataEntity))
        Me.unittime = CInt(enBasicdata(0).unitTime)
    End Sub
    '大于至少时间,返回实际消费时间
    Public Overrides Function HandleTime(time As Integer) As Integer
        Return Math.Abs(Int(-time / unittime)) * unittime
    End Function
'BL_LeastTimeHandler,   至少上机时间类
Public Class BL_LeastTimeHandler : Inherits BL_TimeHandler

    Private LeastTime As Integer
    '构造函数,传入最少上机时间的值
    Public Sub New(ByVal enBasicdata As IList(Of Entity.BasicDataEntity))
        Me.LeastTime = CInt(enBasicdata(0).leastTime)
    End Sub

    Public Overrides Function HandleTime(time As Integer) As Integer
        If time <= LeastTime Then
            Return LeastTime
        Else
            Return calaulate.HandleTime(time)
        End If
    End Function
End Class

至此职责链模式就到此结束了,为了便于调用,可以增加一个接口,方便调用,这样就只需要传入两个参数就可了。

Public Class BL_OnlineTimeCount
    Public Function CostTime(ByVal enbasicdata As IList(Of Entity.BasicDataEntity), enLineInfo As Entity.LineEntity) As Integer
        '实例化类,通过构造函数,传递函数
        Dim bPrepareTime As New BL_PrepareTimeHandler(enbasicdata)
        Dim bLeastTime As New BL_LeastTimeHandler(enbasicdata)
        Dim bStepTime As New BL_unitTimeHandler(enbasicdata)

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

        Dim time As Integer   '计算上下机时间差
        time = DateDiff("n", enLineInfo.Ontime, enLineInfo.Offtime) + DateDiff("n", enLineInfo.Ondate, enLineInfo.Offdate)

        Return bPrepareTime.HandleTime(time)   '职责链处理,返回上机时间
    End Function

End Class

在U层中的调用代码:

Dim enline As New Entity.LineEntity
        With enline
            .Ondate = lineRe(0).Ondate
            .Ontime = lineRe(0).Ontime
            .Offdate = CStr(Format(Now(), "yyyy-MM-dd"))
            .Offtime = CStr(Format(Now(), "HH:mm:ss"))
        End With

        Dim basicdataList As IList(Of Entity.BasicDataEntity)
        Dim BLLBasicdata As BasicDataBLL = New BasicDataBLL()
        Dim enbasicdata As New Entity.BasicDataEntity
  '调用返回基本数据函数,返回实体集合
        basicdataList = BLLBasicdata.ReadBasic(enbasicdata)

        '调用职责链模式,计算上机时间
        enline.consumeTime = onTimeCount.CostTime(basicdataList, enline)

分类:

这样在自己的个人机房重构中就完整的对职责链模式熟悉了一遍,对于职责链的学习,也只是处于一个初级阶段,这也纯属属于“纯的职责链模式(要么承担责任,要么将责任全部推给下一家”,而且要求这个请求在过程结束之前必须能够被一个处理者对象所接收;除此之外还有对应的“不纯的职责链模式(允许某一个请求允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收)”未完


VB.NET & 职责链模式,布布扣,bubuko.com

时间: 2024-12-22 14:48:02

VB.NET & 职责链模式的相关文章

职责链模式Chain of Responsibility

1.简介 1)模式概述:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它位置. 2)核心: 2.UML与代码实现 1)结构:UML 模式组成: 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选) 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者. 客户类

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

下机涉及两个方面,消费时间和消费金额. 对消费时间的处理用的是职责链模式,感觉这个模式用的非常妙,參考的师哥的博客:<机房收费下机中用到的策略与职责链解析>:消费金额的处理用策略模式.针对不同的用户类型. 这里着重介绍职责链的应用. 依据需求,将时间分为三个阶段,准备时间:不收取费用:至少上机时间:大于准备时间,小于至少上机时间的,一律按至少上机时间算.单位递增时间:大于至少上机时间后.按单位递增时间累加. TimeHandler类,定义一个处理请示的接口 Public MustInherit

[设计模式]&lt;6&gt;. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer,原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系. 将这些接受处理的对象连成一条链,并沿着该链处理请求. 一个传说中的应用情景: 假如去政府部门办事,遇到了打字员小丽,在打LOL的小张以及主任老李,互相踢皮球推脱. #include <iostream> using namespace std; class Handler { prote

职责链模式

1.职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,指导有一个对象处理它为止. 2.优点:(1).当客户提交一个申请时,请求是沿链传递直至有一个对象负责处理它位置.在客户端根本不需要知道是谁做的处理.(2).简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用.(3).可以随时增加或者修改处理一个请求的结构.增强了给对象纸牌职责的灵活性. 3.注意:一个请求极有可能到链的末端都

设计模式之行为型模式—— 3.5 职责链模式

<?php /**  * 3.5 职责链模式  *  定义:  *  使多个对象都有机会处理请求,从而避免请求的  *  发送者和接受者直接的耦合关系.将这个对象连  *  成一条链,并沿着这条链传递该请求,直到有一  *  个对象处理它为止.  *  角色:  *  1. 抽象Handler类  *  职责:定义一个处理请示的接口.  *  2. 具体Handler类  *  职责:具体处理者类,处理它所负责的请求  *    ,它可访问它的后继者,如果可处理  *    该请求,就处理之,否

大话设计模式C++实现-第24章-职责链模式

一.UML图 二.概念 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 三.说明  角色: (1)Handler类:定义一个处理请求的接口. (2)ConcreteHandler类:具体的处理请求的接口. 职责链模式的好处: (1)最关键的是,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它. (2)

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

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

学习日记之职责链模式和Effective C++

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着该条链传递该请求,直到有一个对象处理它为止. (1),当客户提交一个请求时,请求时沿着链传递直到有一个 ConcreteHandler 对象负责处理它. (2),接收者和发送者都没有对方的明确信息,切链中的对象自己也不知道链的结构.结果是职责链可简化为对象之间的连接,它们仅需保留一个指向其后继者的引用.而不惜保留它所有的候选接收者的引用

(20):(行为型模式) Chain Of Responsibility 职责链模式

(20):(行为型模式) Chain Of Responsibility 职责链模式,布布扣,bubuko.com