目录
1、需求场景
某银行要开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,账户存在三种状态,且在不同状态下账户存在不同的行为,具体说明如下:
(1) 如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款;
(2) 如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天计算利息;
(3) 如果账户中余额等于-2000,那么账户的状态为受限状态(Restricted State),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息;
(4) 根据余额的不同,以上三种状态可发生相互转换。
2、类图与代码
(1)类图
NormalState表示正常状态,OverdraftState表示透支状态,RestrictedState表示受限状态,在这三种状态下账户对象拥有不同的行为,方法deposit()用于存款,withdraw()用于取款,computeInterest()用于计算利息,stateCheck()用于在每一次执行存款和取款操作后根据余额来判断是否要进行状态转换并实现状态转换,相同的方法在不同的状态中可能会有不同的实现。
(2)客户端代码
我们客户端直接操作一个账户对象,进行取款存款操作。但是随着操作的进行,账户内部一直在进行账户状态的维护。但是客户端没有任何感知,也不需要关心。
package behavioral.state;
public class Client {
public static void main(String args[]) {
Account acc = new Account("段誉",0.0);
acc.deposit(1000);
acc.withdraw(2000);
acc.deposit(3000);
acc.withdraw(4000);
acc.withdraw(1000);
acc.computeInterest();
}
}
执行效果如下:
D:\program\openjdk1.8.0_162\bin\java.exe -javaagent:D:\program\ideaIU-2018.1.1.win\lib\idea_rt.jar=57818:D:\program\ideaIU-2018.1.1.win\bin -Dfile.encoding=UTF-8 -classpath D:\code\msb\practise\DesignPatterns\design_pattern\target\classes;D:\program\openjdk1.8.0_162\jre\lib\charsets.jar;D:\program\openjdk1.8.0_162\jre\lib\deploy.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\access-bridge-64.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\cldrdata.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\dnsns.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\jaccess.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\jfxrt.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\localedata.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\nashorn.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\sunec.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\sunjce_provider.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\sunmscapi.jar;D:\program\openjdk1.8.0_162\jre\lib\ext\sunpkcs11.jar;D:\pr