机房重构职责链模式-上机

来源:互联网 发布:php 策略模式应用场景 编辑:程序博客网 时间:2024/05/18 19:22

前言

在敲上机的时候突然特别的麻烦,调来调取,7层需要走好几次,感觉特别麻烦并且代码都是重复的!感觉没有意思,通过看师哥师姐的博客才知道如何和解决这个问题,利用职责链模式解决问题,减少了重复的代码,ps上机的时候需要判断卡号是否存在,卡号余额是否满足基本数据表中的数据,查看卡号是否正在上机。如果不用职责链模式真的是太麻烦了,深刻的体会到模式的重要性

职责链模式见解

职责链模式属于行为模式。使多个对象都有机会处理请求,从而避免发送者和接受之间的耦合关系,见这些对象连成一条链,并沿着这条链请求,知道有一个对象处理它为止


例子

其实职责链模式就像我们在学校请长期假一样,当我们要请一个月的假的时候,我们需要先向老师申请,如果老师不知道则向主任申请,如果主任不知道则向校长,知道有一个知道为止,如果有一个人同意,则直接通过请假这一条链告诉学习最终结果。这就是职责链模式
如图:
这里写图片描述


职责链模式解释

1.职责链模式,由一个对象引出另一个对象,连接成一条链
2.在这个请求连上,最终会找到一个对象处理此请求为止
3.在客户端发生请求的时候,并不知道最后是谁处理了这个请求,从而减低了耦合,并且在不印象客户端的情况下,可以动态的重新组织连和分配责任

什么时候用?
当有多个对象,但是你不确定是哪个对象可以解决问题
请求的对象可以动态的指定分配


重构职责链模式上机代码

UI层

  '用于查看卡,余额,上机实体            Dim cardInfo As New Entity.ChaEntity            '用于查看卡,余额,上机实体            Dim UserInfo As New Entity.ChaEntity            '向上机表中添加数据实体            Dim OnlineInfo As New Entity.ZenEnity            '用于查看卡,余额,上机的结果            Dim strResult As Boolean            '想上机表中查数据            Dim table1 As Boolean            cardInfo.cardID = txtcarID.Text.Trim            '把实体送到外观            strResult = selectFacade.CheckOnline(cardInfo)            '对返回结果进行判断            If strResult = False Then                MsgBox("卡号不存在或者已经上机,小于最小金额", vbOKOnly)

外观层

Public Function CheckOnline(ByVal cardinfo As Entity.ChaEntity) As Boolean        Dim checkCard As New BLL.checkCardBLl    '判断卡号是否存在        Dim checkMoney As New BLL.CheckMoneyBLL  '判断余额        Dim checkOn As New BLL.checkOn       '判断是否在上机        '职责链模式核心,形成一条链        checkCard.setsuccessor(checkMoney)  '查询卡号之后        checkMoney.setsuccessor(checkOn)    '查询余额之后        Return checkCard.handlecheck(cardinfo)  '第一个先查询卡号    End Function

BLL层

checkCardBLL类

#Region "上机表中查看是否有卡号"    Dim flag As Boolean    Dim table As New DataTable    Public Overrides Function handlecheck(cardInfo As Entity.ChaEntity) As Object        '定义接口        Dim icheckCard As IDAL.ChaXInxiIDAL        '定义泛型        Dim list As New List(Of Entity.ChaEntity)        '定义工厂        Dim checkCardfA As New Factory.ChaFactory        '通过接口得到工厂中的内容        icheckCard = checkCardfA.InquiryBalanceChaFAY()        '通过泛型传给D层        list = icheckCard.IselectCard(cardInfo)        '对返回的数据进行判断,小于0则说明没有卡号,则提示用户,如何大于0则接着向下面进行判断        If list.Count <= 0 Then            Return False            Exit Function        Else            '设置下一个继承者,给余额            Return sucessor.handlecheck(cardInfo)        End If    End Function#End Region

CheckMoneyBLL类

Region "查询基本表中的最少金额和卡表中的余额进行判断,查看是否符合要求"    Public Overrides Function handlecheck(cardInfo As Entity.ChaEntity) As Object        '从基本表中查最少余额        '定义泛型  接口  工厂        Dim list As New List(Of Entity.ChaEntity)        Dim icheckCash As IDAL.ChaXInxiIDAL        Dim factory As New Factory.ChaFactory        '利用接口知道工厂        icheckCash = factory.InquiryBalanceChaFAY        '实现D层的类,基本数据表        list = icheckCash.IselectMoney()        '查卡里的余额        '定义泛型  接口  工厂        Dim mylist As New List(Of Entity.ChaEntity)        Dim iselectcard As IDAL.ChaXInxiIDAL        Dim factory1 As New Factory.ChaFactory        '利用接口知道工厂        iselectcard = factory1.InquiryBalanceChaFAY        '实现D层的类,卡表        mylist = iselectcard.IselectMoney(cardInfo)        '对基本表中的余额与卡表中的余额进行对比,如果为false则不可以上机,否则下一位继承者        If mylist(0).Cash < list(0).leastMoney Then            Return False        Else            Return sucessor.handlecheck(cardInfo) '下一位查看是否上机        End If    End Function#End Region

checkOn类

#Region "查看上机表中,此卡号是否为上机"    Public Overrides Function handlecheck(cardInfo As Entity.ChaEntity) As Object        '定义泛型,接口,工厂        Dim IcheckOn As IDAL.ChaXInxiIDAL        Dim list As New List(Of Entity.ChaEntity)        Dim factory As New Factory.ChaFactory        '通过接口得到工厂        IcheckOn = factory.InquiryBalanceChaFAY        '实现D层方式,上机表        list = IcheckOn.IselectON(cardInfo)        '判断如果小于=0则说明没有上机,则返回true,可以上机,否则false        If list.Count <= 0 Then            Return True            Exit Function        Else            Return False        End If    End Function#End Region

DAL层

#Region "上机时查看是否有此卡号,查看卡表余额和基本数据余额,查看是否上机"#Region "上机时查看是否有此卡号"    Public Function selectCard(cardinfo As ChaEntity) As List(Of ChaEntity) Implements ChaXInxiIDAL.IselectCard        '声明与实例化参数数组,把内容传递给字符串。例如"@cardID"        Dim paras As SqlParameter() = {New SqlParameter("@cardID", cardinfo.cardID),                                       New SqlParameter("@Status", "使用")}        '通过视图中的表得到我们想要的信息        cmdText = "select * from T_CardInfo where cardID =@cardID"        '定义临时保存数据的虚拟表        Dim dt As New DataTable        '声明一个泛型类        Dim table As New List(Of Entity.ChaEntity)        '从sqlhelper中的ExecDataTable类中,把数据给DataTable        dt = sqlhelper.ExecDataTable(cmdText, CommandType.Text, paras)        table = ConverHelper.ConvertHelper.convertToList(Of Entity.ChaEntity)(dt)        '如果大于0则判断有卡号,继续向下执行,否则返回结果        Return table    End Function#End Region#Region "查看是否有次卡号"    Public Function selecton(cardinfo As ChaEntity) As List(Of ChaEntity) Implements ChaXInxiIDAL.IselectON        '声明一个泛型类        Dim table As New List(Of Entity.ChaEntity)        '定义临时保存数据的虚拟表        Dim dt As New DataTable        '声明与实例化参数数组,把内容传递给字符串。例如"@cardID"        Dim paras As SqlParameter() = {New SqlParameter("@cardID", cardinfo.cardID),                                       New SqlParameter("@Status", "上机")}        cmdText = "select * from Online_Info where cardID =@cardID and Status=@Status"        dt = sqlhelper.ExecDataTable(cmdText, CommandType.Text, paras)        table = ConverHelper.ConvertHelper.convertToList(Of Entity.ChaEntity)(dt)        Return table    End Function#End Region#Region "查看该卡号的余额是多少"    Public Function selectMOney(cardinfo As ChaEntity) As List(Of ChaEntity) Implements ChaXInxiIDAL.Iselectmoney        '声明一个泛型类        Dim table As New List(Of Entity.ChaEntity)        '定义临时保存数据的虚拟表        Dim dt As New DataTable        '声明与实例化参数数组,把内容传递给字符串。例如"@cardID"        Dim paras As SqlParameter() = {New SqlParameter("@cardID", cardinfo.cardID),                                       New SqlParameter("@Status", "使用")}        cmdText = "select * from T_CardInfo where cardID =@cardID"        dt = sqlhelper.ExecDataTable(cmdText, CommandType.Text, paras)        table = ConverHelper.ConvertHelper.convertToList(Of Entity.ChaEntity)(dt)        Return table    End Function#End Region#Region "查余额是否满足基本数据表"    Public Function checkMoney() As List(Of ChaEntity) Implements ChaXInxiIDAL.Iselectmoney        '声明与实例化参数数组,把内容传递给字符串。例如"@cardID"        '通过视图中的表得到我们想要的信息        cmdText = "select * from T_BasicData"        '定义临时保存数据的虚拟表        Dim dt As New DataTable        '声明一个泛型类        Dim table1 As New List(Of Entity.ChaEntity)        '从sqlhelper中的ExecDataTable类中,把数据给DataTable        dt = sqlhelper.CheckDataTable(cmdText, CommandType.Text)        '把dt转换为泛型        table1 = ConverHelper.ConvertHelper.convertToList(Of Entity.ChaEntity)(dt)        '返回泛型的数据        Return table1    End Function#End Region#End Region

总结

上机的时候需要判断卡号是否存在,卡号余额是否满足基本数据表中的数据,查看卡号是否正在上机。利用职责链模式我们首先找到卡号,如果有此卡号则链接到余额是否满足要求,如果满足要求则链接到是否上机,如果成功则上机成功,否则提出错误。

2 0
原创粉丝点击