state状态模式-设计模式-行为型

本文介绍了如何使用状态模式在Java中实现账户管理,详细阐述了正常、透支和受限三种账户状态及其行为,通过状态类封装不同状态下的操作,实现了状态转换的透明性和灵活性。
摘要由CSDN通过智能技术生成

目录

1、需求场景

 2、类图与代码

(1)类图

(2)客户端代码

(3)账户类代码

 (4)账户状态抽象类

(5)正常状态类代码

(6)透支状态代码

(7)受限状态代码

3、总结


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值