欢迎来到天天文库
浏览记录
ID:42855246
大小:94.00 KB
页数:3页
时间:2019-09-23
《设计模式-状态模式-银行账户》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、银行系统中的账户类设计Sunny软件公司欲为某银行开发一套信川卡业务系统,银行账户(Account)是该系统的核心类2—,通过分析,Sunny软件公司开发人员发现在该系统中,账户存在三种状态,且在不同状态下账户存在不同的行为,具体说明如下:⑴如果账户中余额大于等于0,则账户的状态为正常状态(NormalState),此时用户既可以向该账户存款也可以从该账户取款;(2)如果账户屮余额小于0,并且人于-2000,则账户的状态为透支状态(OverdraftState),此时川户既町以向该账户存款也吋以从该账户取款,但需要按犬计算利
2、息;(3)如果账户中余额等于-2000,那么账户的状态为受限状态(RestrictedState),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息;(4)根据余额的不同,以上三种状态可发生相互转换。Sunny软件公司开发人员对银行账户类进行分析,绘制了如图2所示UML状态图:图2银行账户状态图在图2中,NormalState表示正常状态,Overdraftstate表示透支状态,RestrictedState表示受限状态,在这三种状态下账户对象拥冇不同的行为,方法deposit()用于存款,withdraw(
3、)用于取款,computelnterest()用于计算利息,stateCheck()用于在每一次执行存款和取款操作后根据余额來判断是否要进行状态转换并实现状态转换,相同的方法在不同的状态中可能会有不同的实现。为了实现不同状态下对■象的各种行为以及对象状态之间的相互转换,Sunny软件公司开发人员设计了一个较为庞大的账户类Account,其中部分代码如下所示:classAccount{privateStringstate;//状态privateintbalance;//余额//存款操作publicvoiddeposit(){/
4、/存款stateCheck();//取款操作publicvoidwithdraw(){if(state.equalsIgnoreCase(/zNormalState/,)
5、
6、state.equalslgnoreCase(z/0verdraftState〃)){〃取款stateCheck();}else{〃取款受限}i//计算利息操作publicvoidcomputeinterest(){if(state.equalslgnoreCase(/z0verdraftState^)
7、
8、state.equalslgnoreCase(,
9、zRestrictedState")){〃计算利息//状态检查和转换操作publicvoidstateCheck(){if(balance>=0){state=^Normalstate";elseifi(balance>-2000&&balance<0)state=/z0verdraftStatez/;jelseif(balance=-2000){state=,zRestrictedState,z;elseif(balance<-2000)//操作受限分析上述代码,我们不难发现存在如下几个问题:(1)几乎每个方法中都包含状态
10、判断语句,以判断在该状态下是否具有该方法以及在特定状态下该方法如何实现,导致代码非常冗长,可维护性较差;(2)拥有一个较为复杂的stateCheck()方法,包含大量的if...elseif...else…语句用于进行状态转换,代码测试难度较人,且不易于维护;(1)系统扩展性较差,如果需要增加一•种新的状态,如冻结状态(FrozenState,在该状态下既不允许存款也不允许取款),需要对原有代码进行大量修改,扩展起来非常麻烦。为了解决这些问题,我们可以使用状态模式,在状态模式屮,我们将对象在每一个状态下的行为和状态转移语句封
11、装在一个个状态类屮,通过这些状态类来分散兀长的条件转移语句,让系统具有更好的灵活性和可扩展性,状态模式可以在一定程度上解决上述问题。
此文档下载收益归作者所有