职责链模式!
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
在机房重构中上机时需要对 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个实体,这是前期命名规范,全局观没有做好,自己懒没有改所以这些代码还是有很大的优化的空间的。设计模式就是多看,多实践,多用就能理解的知识。