【机房重构】--职责链模式实现上机
来源:互联网 发布:塞上牛羊空许约 知乎 编辑:程序博客网 时间:2024/06/09 19:35
初衷
机房重构写到上机这块的时候,觉得和之前那些简单的一条线判断或者返回数据就可以实现的功能有些不一样了,也不是说他有多复杂的逻辑,其实只是多此判断真的很麻烦,重复的代码让我闻到了代码的坏味道,所以想要借用一下设计模式的一些套路。
why 职责链模式?
上机需要的判断有哪些?
- 卡号是否存在,且正在使用
- 卡号余额是否充足(大于基础数据表设定最少金额)
- 卡号是否正在上机
如果让你写四条线来判断在七层里面走来走去,不知道你是不是会疯掉。。
职责链模式介绍?
什么是链?
- 一系列节点的集体
- 各节点灵活可拆分
———-
职责链模式UML图
- Handler是一个处理请求的抽象接口,在上机中表示处理判断的抽象父类,用来设置具体判断类的下一继承者,比如第一个卡号判存完毕之后设置下一个判断–余额是否充足。
- 上机的三个条件分别为实现抽象接口的三个子类。
- 当返回的一个泛型记录携带者他的信息进入这个链条的时候,会经历这三个子类链条式的判断,满足第一个条件,则通过第一个子类连接到下一个子类进行判断,如果满足第二个则连接到下一个子类去判断。
如果第一个子类就判断不通过,那第一个子类就会直接做出处理了。
所以当这个判断请求进入这个链条时,这个请求会被链条传递下去,直到有一个对象处理它为止。请求的发送者和接受者是没有关联的,所以做到了解耦和。
Demo–上机
UI
''' <summary> ''' 上机 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub btnOnline_Click(sender As Object, e As EventArgs) Handles btnOnline.Click If txtCardno.Text = "" Then MsgBox("上机请输入卡号!") Else '定义实体层 Dim CardInfo As New Entity.CardEntity Dim OnlineInfo As New Entity.OnlineEntity Dim result As Boolean Dim flag As Boolean Dim onlinefac As New Facade.T_OnlineFacade CardInfo.caroNo = txtCardno.Text.Trim result = onlinefac.CheckOnline(CardInfo, OnlineInfo) OnlineInfo.CardNo = txtCardno.Text.Trim Dim currentDate As DateTime = DateTime.Now OnlineInfo.OnDate = currentDate.ToShortDateString OnlineInfo.OnTime = currentDate.ToLongTimeString OnlineInfo.PcName = Environment.MachineName If result = True Then '满足上机的三个条件,可以上机 '增加上机表的记录 Dim addonlineFAC As New Facade.T_OnlineFacade flag = addonlineFAC.Addonline(OnlineInfo) If flag = True Then txtStuno.Text = OnlineInfo.StudentNo txtName.Text = OnlineInfo.StudentName txtDepart.Text = OnlineInfo.Department txtSex.Text = OnlineInfo.Sex txtType.Text = OnlineInfo.CardType txtRemaincash.Text = OnlineInfo.RemainCash.ToString txtOndate.Text = OnlineInfo.OnDate.ToString txtOntime.Text = OnlineInfo.OnTime.ToString MsgBox("上机成功!") End If Else MsgBox("不满足上机条件,请重新输入卡号或充值!") End If End If '调用模块方法,清空 Call Rdim() AllEmpty(arrayControl) End Sub
Facade (部分)
''' <summary> ''' 职责连模式判断是否满足上机条件 ''' </summary> ''' <param name="CardInfo"></param> ''' <param name="OnlineInfo"></param> ''' <returns>boolean</returns> ''' <remarks></remarks> Public Function CheckOnline(ByVal CardInfo As CardEntity, ByVal OnlineInfo As OnlineEntity) As Boolean Dim bllCardno As New BLL.T_OnlineBLL.CheckCardnoBLL Dim bllCardcash As New BLL.T_OnlineBLL.CheckCashBLL Dim bllOnline As New BLL.T_OnlineBLL.CheckOnBLL Dim flag As Boolean '设置继承链条 bllCardno.setsuccessor(bllCardcash) bllCardcash.setsuccessor(bllOnline) flag = bllCardno.HandleCheck(CardInfo, OnlineInfo) Return flag End Function
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.CardEntity, ByVal OnlineInfo As OnlineEntity) As Object End Class ''' <summary> ''' 子类1:CheckCardnoBLL 确定卡号是否存在 ''' </summary> ''' <remarks></remarks> Public Class CheckCardnoBLL : Inherits HandlerBLL Public Overrides Function HandleCheck(ByVal CardInfo As CardEntity, ByVal OnlineInfo As OnlineEntity) As Object '重写抽象方法 Dim icheckcard As IDAL.IOnlineDAL Dim checkfactory As New Factory.T_OnlineFactory Dim mylist As New List(Of Entity.CardEntity) icheckcard = checkfactory.CreateIonline '创建接口实例 mylist = icheckcard.IselectCard(CardInfo) '小于0 ,没有卡号,提示用户;大于0, 继续往下判断 If mylist.Count <= 0 Then Return False Else '设置下一个继承者,给余额 Return successor.HandleCheck(CardInfo, OnlineInfo) End If End Function End Class ''' <summary> ''' 子类2:CheckCashBLL 确定卡号余额是否充足 ''' </summary> ''' <remarks></remarks> Public Class CheckCashBLL : Inherits HandlerBLL Public Overrides Function HandleCheck(ByVal CardInfo As CardEntity, ByVal OnlineInfo As OnlineEntity) As Object '获取卡表余额 Dim icheckcash As IDAL.IOnlineDAL Dim checkfactory1 As New Factory.T_OnlineFactory Dim mylist1 As New List(Of Entity.CardEntity) icheckcash = checkfactory1.CreateIonline '创建接口实例 mylist1 = icheckcash.Iselectmoney(CardInfo) '获取基本数据表最少金额 Dim icheckleastcash As IDAL.IOnlineDAL Dim checkfactory2 As New Factory.T_OnlineFactory Dim mylist2 As New List(Of Entity.DataBaseEntity) icheckleastcash = checkfactory2.CreateIonline mylist2 = icheckleastcash.Icheckmoney() '对比余额是否少于最少金额 If CDec(mylist1(0).remainCash) < CDec(mylist2(0).leastCash) Then Return False Else Return successor.HandleCheck(CardInfo, OnlineInfo) End If End Function End Class ''' <summary> ''' 子类3:CheckOnBLL 确定卡号是否正在上机 ''' </summary> ''' <remarks></remarks> Public Class CheckOnBLL : Inherits HandlerBLL Public Overrides Function HandleCheck(CardInfo As CardEntity, OnlineInfo As OnlineEntity) As Object Dim icheckon As IDAL.IOnlineDAL Dim checkonfactory As New Factory.T_OnlineFactory Dim mylist As New List(Of Entity.OnlineEntity) icheckon = checkonfactory.CreateIonline mylist = icheckon.IselectOn(OnlineInfo, CardInfo) If mylist.Count <= 0 Then ' <=0 说明没有正在上机 Return True Exit Function End If Return False End Function End Class
总结
学习是i+1 的过程,i就是之前学过的知识,如果你觉得i+1比较困难,说明你的i没有做好,那就踏踏实实回去做好这个i,编制知识网就是在这个i的基础上做的,i很重要,i+1 更重要。
阅读全文
1 0
- 【机房重构】--职责链模式实现上机
- 机房重构职责链模式-上机
- 【机房重构】职责链模式之上机
- 职责链模式实现机房上机
- 【机房重构】--职责链模式+策略模式 实现下机
- 机房重构--职责链模式应用
- 机房重构之职责链模式
- 机房上机--职责连模式
- 机房重构——下机(职责链模式+策略模式)
- 【机房重构】下机——职责链模式+策略模式(理论篇)
- 【机房重构】下机——职责链模式+策略模式(实践篇)
- 职责链模式应用——下机(机房重构知识点总结)
- 机房重构——职责链模式搞定计算下机时间问题
- 【机房重组】 职责链模式
- 【机房重构个人版】上下机与职责链
- 【机房重构】—上机&订餐
- 机房合作之职责链模式
- 个人机房重构——下机与职责链的结合
- 蜂鸣器
- Python命令行工具开发之一: 使用基本标准输入编写命令行工具
- SparkJobServer设计
- (JAVA) Z字形扫描
- 观察者模式
- 【机房重构】--职责链模式实现上机
- (164)定制表达式
- Spark MLlib 入门学习笔记
- HDU1255-覆盖的面积(线段树+扫描线——面积交)
- 关于gcd的函数和过程两种不同写法
- 装饰者模式(待记录)
- 在web开发中hibernate3插入数据库日期不一致的问题解决方法
- pycharm调试debug入门
- [leetcode]593. Valid Square