职责链模式--机房重构应用

职责链模式!
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
在机房重构中上机时需要对 3个对象请求:卡号是否在线,卡中余额,添加卡号到上机表。
我们不能同时做这些请求,我们就要把这些对象连成链条依次执行,不满足就会退出。(在BLL层体现出来。)

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
UI层

'可以用其他的事件,适合自己的就好。
  Private Sub FrmUserMian_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '实例化一个对象
        Dim UserLineinfo As New Entity.LineEntity
        UserLineinfo.UserID = FrmLogin.AdminID
        UserLineinfo.Logindate = FrmLogin.DayTime
        UserLineinfo.Computer = FrmLogin.Comptername
        UserLineinfo.Level = "用户"

        Dim CardInfo As New Entity.RechargeEntity
        CardInfo.CardNo = FrmLogin.AdminID

        Dim basicdate As New Entity.BasicDateEntity

        '添加用户在线记录 AddUserLine
        Dim Facade As New Facade.LogComputerFacade
        Dim strResult As Boolean

        '将U层文本框的内容传入外观曾,然后通过外观层传入B层
        strResult = Facade.CheckOnline(CardInfo, UserLineinfo, basicdate)
        If strResult = True Then
            MsgBox("成功上机!") '添加成功
        Else
            MsgBox("添加失败!")'添加失败
        End If      
  End Sub

Facade 层

Public Class LogComputerFacade
    ''' <summary>
    ''' 职责连模式判断是否上机
    ''' </summary>
    ''' <param name="CardInfo"></param>  '3个参数名字
    ''' <param name="UserLineinfo"></param>
    ''' <param name="basicdate"></param>     
    ''' <returns></returns>
    Public Function CheckOnline(ByVal CardInfo As RechargeEntity, ByVal UserLineinfo As LineEntity, ByVal basicdate As BasicDateEntity) As Boolean
        '实例化BLL层方法,用来调用。
        Dim bllLine As New BLL.CheckLineBLL
        Dim bllCardcash As New BLL.CheckCashBLL
        Dim bllAddline As New BLL.AddLineStateBLL

        '设置继承链条(用来指定下一个执行的对象)
        bllLine.setsuccessor(bllCardcash)      
        bllCardcash.setsuccessor(bllAddline)

        '调用BLL层的方法
        Dim flag As Boolean        '定义接受返回变量的参数。
        flag = bllLine.HandleCheck(CardInfo, UserLineinfo, basicdate)
        Return flag                '返回参数

    End Function
End Class

BLL 层

''' <summary>
''' 抽象类
''' </summary>
''' <remarks></remarks>
Public MustInherit Class HandlerBLL
    Protected successor As HandlerBLL
    Public Sub setsuccessor(ByVal successor As HandlerBLL) '设置继承类
        Me.successor = successor
    End Sub
    '处理请求的抽象方法
    Public MustOverride Function HandleCheck(ByVal CardInfo As Entity.RechargeEntity, ByVal UserLineinfo As LineEntity, ByVal basicdate As Entity.BasicDateEntity) As Object

End Class

''' <summary>
''' 子类1:CheckLineBLL  卡号是否在线
''' </summary>
''' <remarks></remarks>
''' 
Public Class CheckLineBLL : Inherits HandlerBLL

    Public Overrides Function HandleCheck(ByVal CardInfo As Entity.RechargeEntity, ByVal UserLineinfo As LineEntity, ByVal basicdate As Entity.BasicDateEntity) As Object  '重写抽象方法

        Dim IDAL As IDAL.IInquiryLineIDAL
        Dim Factory As New Factory.InquiryLineFactory
        Dim table As DataTable

        IDAL = Factory.CreateLine     '创建接口实例
        table = IDAL.GetLine(UserLineinfo)

        '用户是否在线
        If table.Rows.Count = 0 Then
            '设置下一个继承者(CheckCashBLL)
            Return successor.HandleCheck(CardInfo, UserLineinfo, basicdate)
        Else
            '不满足条件返回
            Return False

        End If
    End Function
End Class
''' <summary>
''' 子类2:CheckCashBLL  确定卡号余额是否充足
''' </summary>
''' <remarks></remarks>
Public Class CheckCashBLL : Inherits HandlerBLL

    Public Overrides Function HandleCheck(ByVal CardInfo As Entity.RechargeEntity, ByVal UserLineinfo As LineEntity, ByVal basicdate As Entity.BasicDateEntity) As Object
        '获取卡表余额
        Dim IDALCash As IDAL.ICardIDAL
        Dim FactoryCash As New Factory.CardFactory
        IDALCash = FactoryCash.Card

        Dim table As DataTable
        table = IDALCash.ICard(CardInfo)

        '获取基本数据表最少金额
        Dim IDAlDate As IDAL.IBasicDateIDAL
        Dim FactoryDate As New Factory.BasicDateFactory
        IDAlDate = FactoryDate.CreateBasicDate

        Dim DateTable As DataTable
        DateTable = IDAlDate.ICheckBasicDate(basicdate)


        '对比余额是否少于最少金额
        If CDec(table.Rows(0).Item(1)) < CDec(DateTable.Rows(0).Item(5)) Then
           '不满足条件返回
            Return False
        Else
            '设置下一个继承者(AddLineStateBLL)
            Return successor.HandleCheck(CardInfo, UserLineinfo, basicdate)
        End If
    End Function
End Class

''' <summary>
''' 子类3:AddLineStateBLL  添加卡号上线
''' </summary>
''' <remarks></remarks>
''' 
Public Class AddLineStateBLL : Inherits HandlerBLL

    Public Overrides Function HandleCheck(ByVal CardInfo As Entity.RechargeEntity, ByVal UserLineinfo As LineEntity, ByVal basicdate As Entity.BasicDateEntity) As Object  '重写抽象方法

        Dim IDAL As IDAL.ILogOutIDAL
        Dim Factory As New Factory.LogOutFactory

        Dim flag As Boolean
        IDAL = Factory.AddUserLine   '创建接口实例
        flag = IDAL.AddUserLine(UserLineinfo)
        '用户是否在线
        If flag = True Then
            '在这可以继续添加设置下一个继承者,给余额
            Return True
        Else
            '不满足条件返回
            Return False
        End If
    End Function
End Class

我在这三层中就展示了职责链模式,其他的层的代码可以按照7层的中的后面的写就OK了。
在设计模式运用时使用了其他的模块的代码导致自己传参用了3个实体,这是前期命名规范,全局观没有做好,自己懒没有改所以这些代码还是有很大的优化的空间的。设计模式就是多看,多实践,多用就能理解的知识。

猜你喜欢

转载自blog.csdn.net/m18330808841/article/details/80545969