状态模式与上机
在机房收费的合作版中,组长将状态模式和上机相结合勾出了设计图,我根据自己的理解对其进行了完善和补充。
一业务描述
输入卡号,点击上机按钮,判断卡号是否存在,接着判断余额是否充足,再判断该卡是否正在上机,如果没有上机那么向数据库中填入一条记录。相对比别的操作,上机就显得相对复杂,需要做判断卡号是否存在,余额是否充足,此卡是否上机以及在数据库中填入数据四个操作。需要特别注意的是只有将四个模式紧紧联系在一起才能称为完整的上机。而且只有做完判断才能进入填充数据库这个操作。因此,刚开始我们将一个多分支语句放在了OnlineBLL中帮助我们进行判断。
二状态模式简述
状态模式属于创建型模式,用于类的创建,主要意图是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其他类,比较适合应对开放性的工程。在以下两种情况下特别适合状态模式:1一个对象的状态不确定,经常需要在不同状态中切换2一个对象的运行包含了大量的多分支条件,且这些多分支条件通常依赖于状态。
状态模式的特点:1擅长把复杂的逻辑判断简化2当需要增加啊新的判断条件时,尽可能地减少了可能会影响的类3将大量的分支判断从某个类中解放出来,分给不同的类,符合“单一原则”4代码的具体实现放在了抽象类的子类中,context中通常只放置调用关系5经常根据context的属性来分配状态
三状态模式与上机的结合
为了尽可能地简化代码,增加代码的开放性,减少类与类的关系,我们将上机与设计模式相相结合。OnlineBLL负责设置初始状态,调用子类的方法以及状态的转换。CardStateBLL是抽象类。CardNoExitBLL负责对卡是否存在判断,LeastCashStateBLL负责对余额是否充足进行判断,IsOnlineStateBLL负责对是否上机进行判断,AddOnlineRecordBll负责增加一条记录。为了将两者结合,我们解决了下面的几个问题
1状态的确定:在状态模式中,一个对象往往有多个状态,我们把上机中存在的“判断卡是否存在,余额是否充足,是否已上机,增加记录”四个操作当成四种状态。
2切换:在OnlineBLL中,我们设置了SetCurrentState方法,负责状态的切换
Public Function SetCurrentState(ByVal s As CardStateBLL) current = s Return current End Function
3判断: 我们将判断放在了子类中
If enCard.ProCardNo = table.Rows(0).Item("cardNo") Then '做出判断 work.SetCurrentState(New LeastCashStateBLL()) '符合预期就进入下一个模式 work.Online(enOnlineRecord, enCard) '利用调用的方法再次进行判断
4跳出状态 当状态的判断不符合预期时,我们使用自定义异常来跳出
Try If enCard.ProCardNo = table.Rows(0).Item("cardNo") Then '做出判断 work.SetCurrentState(New LeastCashStateBLL()) '符合预期就进入下一个模式 work.Online(enOnlineRecord, enCard) '利用调用的方法再次进行判断 End If Catch Dim announcement As New ArgumentException("此卡不存在") '抛出自定义异常 Throw announcement End Try
四优点
上机与状态模式相结合优点多多。
1当增加了新的判断条件时,不必像原来一样需要对OnlineBLL进行大量修改
2将大量的判断从OnlineBLL中解放出来,使代码符合了单一原则职能
3简化了逻辑判断,使得模式一目了然
4减少了类与类之间的依赖,使代码易于扩展。