职责链模式和策略模式

机房重构中上下机用到了职责链模式和策略模式;

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

这里写图片描述

为什么要用职责链模式?
判断条件多的时候,可以用职责链模式,有下家判断传给下个人,没有自行处理这个请求。

代码实现:
UI层

strResult = OnLineFacade.CheckOnInfo(CardInfo, OnLineInfo, BasicInfo)'满足上机的三个条件,可以上机;不满足,退出。

Facade层

Public Function CheckOnInfo(ByVal CardInfo As Entity.CardEntity, ByVal OnLineInfo As Entity.OnLineEntity, BasicInfo As Entity.BasicDataSetEntity) As Boolean
        Dim IsCardInfoExists As New BLL.CheckCardNoBLL   '判断卡号是否存在
        Dim CheckMoney As New BLL.CheckMoneyBLL   '判断余额
        Dim CheckOnLine As New BLL.CheckOnLineBLL   '判断是否正在上机

        Dim flag As Boolean
        '职责链模式核心,形成一条链
        IsCardInfoExists.setsuccessor(CheckMoney)   '查询卡号之后
        CheckMoney.setsuccessor(CheckOnLine)   '查询余额之后
        flag = IsCardInfoExists.HandleCheck(CardInfo, OnLineInfo, BasicInfo)   '第一个先查询卡号
        Return flag
    End Function

BLL层

Imports System.Data.SqlClient   '前面的sqlconnection对象的引入要加入Imports System.SqlClient
Imports Entity
Imports IDAL
Imports Factory
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.CardEntity, ByVal OnLineInfo As Entity.OnLineEntity, ByVal BasicInfo As Entity.BasicDataSetEntity) As Object

End Class

‘判断卡号

Imports System.Data.SqlClient
Imports Entity
Imports IDAL
Imports Factory
Public Class CheckCardNoBLL : Inherits HandlerBLL
    Public Overrides Function HandleCheck(ByVal CardInfo As Entity.CardEntity, ByVal OnLineInfo As Entity.OnLineEntity, ByVal BasicInfo As Entity.BasicDataSetEntity) As Object
        Dim ICheckCard As IDAL.OnLineCheckCardIDAL
        Dim Factory As New Factory.Factory
        Dim flag As Boolean
        ICheckCard = Factory.CreateOnLineCheckCard()
        flag = ICheckCard.SelectCard(CardInfo)
        If flag = False Then
            Return successor.HandleCheck(CardInfo, OnLineInfo, BasicInfo)'设置下一个继承者,给余额
        Else
            Return True
        End If
    End Function
End Class

‘判断余额是否充足

Imports System.Data.SqlClient
Imports Entity
Imports IDAL
Imports Factory
Public Class CheckMoneyBLL : Inherits HandlerBLL
    Public Overrides Function HandleCheck(CardInfo As CardEntity, OnLineInfo As OnLineEntity, BasicInfo As BasicDataSetEntity) As Object
        '获取卡表余额 
        Dim ICheckMoney As IDAL.OnLineCheckMoneyIDAL
        Dim Factory As New Factory.Factory
        'Dim MyList As New List(Of Entity.CardEntity)
        Dim flag As Boolean
        Dim table1 As New DataTable
        ICheckMoney = Factory.CreateOnLineCheckMoney()
        'MyList = ICheckMoney.SelectMoney(CardInfo)
        table1 = ICheckMoney.SelectMoney(CardInfo, BasicInfo)
        If table1.Rows.Count = 0 Then
            flag = True
            Return flag
        Else
            flag = False
        End If

        '获取基本数据表最少金额
        Dim ICheckLeastMoney As IDAL.OnLineCheckLeastIDAL
        Dim Factory1 As New Factory.Factory
        'Dim MyList1 As New List(Of Entity.BasicDataSetEntity)
        Dim flag1 As Boolean
        Dim table As New DataTable
        ICheckLeastMoney = Factory1.CreateOnLineCheckLeastMoney()
        'MyList1 = ICheckLeastMoney.CheckMoney()
        table = ICheckLeastMoney.CheckMoney(BasicInfo)

        If CardInfo.Cash > BasicInfo.LeastCash Then
            flag1 = True
            Return flag1
        Else
            Return successor.HandleCheck(CardInfo, OnLineInfo, BasicInfo)
        End If
    End Function
End Class

‘判断卡号是否正在上机

Imports System.Data.SqlClient
Imports Entity
Imports IDAL
Imports Factory
Public Class CheckOnLineBLL : Inherits HandlerBLL
    Public Overrides Function HandleCheck(ByVal CardInfo As Entity.CardEntity, ByVal OnLineInfo As Entity.OnLineEntity, ByVal BasicInfo As Entity.BasicDataSetEntity) As Object
        Dim ICheckOnLine As IDAL.OnLineCheckOnLineIDAL
        Dim Factory As New Factory.Factory
        'Dim MyList As New List(Of Entity.OnLineEntity)
        Dim flag As Boolean
        ICheckOnLine = Factory.CreateOnLine()
        flag = ICheckOnLine.SelectOnLine(OnLineInfo)
        If flag = True Then
            Return True
        Else
            Return False
        End If
    End Function
End Class

策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户;

UI层

'选择卡类型,计算花费金额
        LineInfo.CostCash = Facade2.SelectType(BasicInfo, CardInfo, LineInfo)
        CardInfo.Cash = CDec(Int(CardInfo.Cash)) - CDec(Int(LineInfo.CostCash))

Facade层

Public Class CashContextFacade
    'Dim cashsuper As CashSuper
    Dim cashsuper As BLL.CashSuper
    '根据策略不同,采用不同的计费方式
    Public Function SelectType(ByVal BasicInfo As Entity.BasicDataSetEntity, ByVal CardInfo As Entity.CardEntity, ByVal LineInfo As Entity.LineEntity) As Single

        Select Case CardInfo.Type.Trim()
            Case "会员用户"
                cashsuper = New BLL.VipUserBLL() '实例化固定用户策略
            Case "普通用户"
                cashsuper = New BLL.TmpUserBLL()
        End Select
        Return cashsuper.GetConsumMoney(BasicInfo, CardInfo, LineInfo)
    End Function
End Class

BLL层,以普通用户为例

Imports System.Reflection
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Data
Public Class TmpUserBLL : Inherits CashSuper '临时用户
    Dim TmpRate As Single
    Public Overrides Function GetConsumMoney(ByVal BasicInfo As Entity.BasicDataSetEntity, ByVal CardInfo As Entity.CardEntity, ByVal LineInfo As Entity.LineEntity) As Single
        TmpRate = BasicInfo.TmpRate
        Dim CostMoney As Single
        CostMoney = Trim(CSng(TmpRate) * CSng(LineInfo.CostTime * 1.0 / 60))
        If CostMoney < Int(BasicInfo.TmpRate) Then
            CostMoney = Int(BasicInfo.TmpRate)
        Else
            Return CostMoney
        End If
        Return CostMoney
    End Function
End Class

我在充值表中加入了策略模式:
普通用户充100就是充100;会员用户充100赠20;

RechargeInfo.AddMoney = Facade2.SelectType(CardInfo, RechargeInfo)
Public Class RechargeContextFacade
    Dim cashsuper As BLL.RechargeCashSuper
    '根据策略不同,采取不同的计费方式
    Public Function SelectType(ByVal CardInfo As Entity.CardEntity, ByVal RechargeInfo As Entity.RechargeEntity)
        Select Case CardInfo.Type.Trim()
            Case "会员用户"
                cashsuper = New BLL.RechargeVipUserBLL()
            Case "普通用户"
                cashsuper = New BLL.RechargeTmpUserBLL()
        End Select
        Return cashsuper.GetConsumMoney(CardInfo, RechargeInfo)
    End Function
End Class
Imports System.Reflection
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Data
Imports Entity

Public Class RechargeTmpUserBLL : Inherits RechargeCashSuper
    Dim AddMoney As Single
    Public Overrides Function GetConsumMoney(ByVal CardInfo As Entity.CardEntity, ByVal RechargeInfo As Entity.RechargeEntity) As Single
        AddMoney = RechargeInfo.AddMoney
        AddMoney = AddMoney * 1.0
        Return AddMoney
    End Function
End Class
Public Class RechargeVipUserBLL : Inherits RechargeCashSuper
    Dim AddMoney As Single
    Public Overrides Function GetConsumMoney(ByVal CardInfo As Entity.CardEntity, ByVal RechargeInfo As Entity.RechargeEntity) As Single
        'Throw New NotImplementedException()
        AddMoney = RechargeInfo.AddMoney
        AddMoney = AddMoney * 1.2
        Return AddMoney
    End Function
End Class

猜你喜欢

转载自blog.csdn.net/xsh096011/article/details/80869743