目前的学习进度,已经足够我们做一个小的项目,锻炼我们的逻辑思维。今天,笔者就带领大家做一个简单的ATM机系统,模仿几个ATM机的业务功能。
最终的效果展示:
登录失败:
存款:
取款:
转账:
查看余额:
不管做什么项目,只要是Java语言开发的,都要遵循面向对象的思想。我们对这个系统进行分析,都需要哪些对象呢?
首先,ATM是一个机器,我们要把ATM抽象为一个对象。ATM代表的是一个银行,一个银行肯定有用户,所以ATM机应该包含一些用户。另外,ATM是这个系统的主要实现,它应该有一些方法,比如展示菜单、供用户登录、转账、取款等。
其次,这些用户应该有哪些属性呢?基本的,要有用户名、银行账号、密码、余额。至于业务功能,我们已经抽象到了ATM身上。
另外,我们需要一个启动类,来测试我们的程序。
基于上面的表述,让我们开始做这个项目!
3构建银行用户创建一个SysUser类,表示银行系统用户:
这里我们将字段声明成public的,后面会为大家介绍get和set方法。
package user;/** * ATM系统用户 * * @author Java开发之旅 * @date 2020-07-26 * */public class SysUser { //用户名 public String username; //账号 public String account; //密码 public String password; //账户余额 public double money;}
4构建ATM机
创建一个Atm类,表示ATM机:
package atm;import user.SysUser;import java.util.Scanner;/** * ATM机 * * * @author Java开发之旅 * @date 2020-07-26 * */public class Atm { //ATM系统用户,这里应该是一个集合,因为一个银行有多个用户,但我们只模拟一个 private SysUser user; //键盘录入器 private Scanner scanner = new Scanner(System.in);}
5加载用户
ATM机启动的时候,要将用户的信息加载进来,所以我们应该在Atm类编写一个加载用户的方法,并且这个方法应该是私有的,只能由ATM去执行:
/** * 加载所有用户,在ATM机启动时调用 * */private void loadUser () { //简单的模拟一下初始化用户的过程,真正的场景是从数据库加载,后期会讲到 this.user = new SysUser(); this.user.username = "张三"; this.user.account = "666666"; this.user.password = "123456"; //初识金额为1000 this.user.money = 1000.0;}
6用户登录
用户加载完毕,当用户使用ATM机的时候,应该先插卡,然后输入密码,进行登录,只不过我们只能模拟输入卡号的情形。所以,Atm类应该有一个登录的方法,且密码最多输入3次:
/** * 用户登陆,在ATM机启动时调用 * */private boolean login () { //接收用户输入的用户名 System.out.println("请输入您的账号:"); String account = scanner.next(); //记录输入密码的次数,最多输入3次,否则锁定账户 int count = 0; do { //如果不是第一次输入,给出操作提示 if (count == 0) { System.out.println("请输入您的密码:"); }else { System.out.println("密码错误,您还有" + (3 - count) + "次机会:"); } String password = scanner.next(); //每输入一次密码,次数+1 count++; //匹配成功,返回true if (account.equals(this.user.account) && password.equals(this.user.password)) { return true; } }while (count < 3); //代码执行到这里,说明3次都没有匹配上,返回false return false;}
7展示菜单
ATM机应该有一个方法,将菜单展示给用户,这一点很好理解:
/** * 加载菜单 * */private void loadMenu () { System.out.println(); System.out.println("********************欢迎使用Java银行********************"); System.out.println("1、存款 2、取款 3、转账 4、查询余额 5、退出");}
8实现存款
/** * 存款的业务方法 * */private void deposit () { System.out.println("\n请输入您的存款数额:"); double money = scanner.nextDouble(); if (money <= 0) { System.out.println("请输入正确的数额!"); return; } this.user.money += money; System.out.println("存款成功,您目前的余额为:" + this.user.money);}
9实现取款
/** * 取款的业务方法 * */private void withdrawal () { System.out.println("\n请输入您的取款数额:"); double money = scanner.nextDouble(); if (money < 0) { System.out.println("请输入正确的数额!"); return; } //余额不足的情况 if (money > this.user.money) { System.out.println("您的账户余额不足"); return; } this.user.money -= money; System.out.println("取款成功,您目前的余额为:" + this.user.money);}
10实现转账
/** * 转账的业务方法 * */private void transfer () { System.out.println("请输入对方的账号:"); String account = scanner.next(); //假设另一个账户是55555,随便模拟一下账户不存在的情况 if (!account.equals("55555")) { System.out.println("账号不存在!"); return; } System.out.println("请输入转账数额:"); double money = scanner.nextDouble(); //余额不足的情况 if (money > this.user.money) { System.out.println("您的账户余额不足"); return; } //转出方的钱减少 this.user.money -= money; //转入方的钱增加,我们这里只有一个账户,模拟一下即可 //this.user2.money += money; System.out.println("转账成功,您目前的余额为:" + this.user.money);}
11查看余额
/** * 查询余额 * */private void getMoney () { System.out.println("您的账户余额为:" + this.user.money);}
12选择业务功能
/** * 提供业务服务的方法 * */private void service () { //记录用户的选择 int choose = 0; //通过while死循环,实现业务的多次选择,直到用户选择退出 while (true) { System.out.println("请选择您要办理对业务:") choose = scanner.nextInt(); switch (choose) { case 1: deposit(); break; case 2: withdrawal(); break; case 3: transfer(); break; case 4: getMoney(); break; case 5: return; default: return; } //每执行完一个业务,重新将菜单展示给用户 loadMenu(); }}
13启动ATM机
上面的方法都是私有的,我们应该暴露出一个公共的方法,让调用者启动ATM机。同时,在ATM机启动的时候,应该加载用户,然后让用户登录:如果登录失败,冻结账户,结束业务;如果登录成功,展示菜单给用户。
/** * 启动ATM机的方法,暴露给调用者 * */public void start () { //先加载用户到ATM机 loadUser(); //登录 boolean flag = login(); //登录失败,直接结束业务 if (!flag) { System.out.println("您的密码3次全部输入错误,账户已被锁定,请到柜台办理相关业务"); //当方法没有任何返回值,此时return语句表示结束方法,不再往下执行 return; } System.out.println("\n登录成功!"); //向用户展示菜单 loadMenu(); //调用业务功能 service(); System.out.println("欢迎下次使用!"); }
我们再创建一个Run类,测试我们的程序:
import atm.Atm;/** * 启动类 * * @author Java开发之旅 * @date 2020-07-26 * */public class Run { public static void main(String[] args) { //启动类负责声明ATM机,并启动它 Atm atm = new Atm(); atm.start(); }}
然后大家就可以看到效果了!
14整体代码最后,贴出整体的Atm类代码:
package atm;import user.SysUser;import java.util.Scanner;/** * ATM机 * * * @author Java开发之旅 * @date 2020-07-26 * */public class Atm { //ATM系统用户,这里应该是一个集合,因为一个银行有多个用户,但我们只模拟一个 private SysUser user; //键盘录入器 private Scanner scanner = new Scanner(System.in); /** * 加载所有用户,在ATM机启动时调用 * */ private void loadUser () { //简单的模拟一下初始化用户的过程,真正的场景是从数据库加载,后期会讲到 this.user = new SysUser(); this.user.username = "张三"; this.user.account = "666666"; this.user.password = "123456"; //初识金额为0 this.user.money = 1000.0; } /** * 用户登陆,在ATM机启动时调用 * */ private boolean login () { //接收用户输入的用户名 System.out.println("请输入您的账号:"); String account = scanner.next(); //记录输入密码的次数,最多输入3次,否则锁定账户 int count = 0; do { //如果不是第一次输入,给出操作提示 if (count == 0) { System.out.println("请输入您的密码:"); }else { System.out.println("密码错误,您还有" + (3 - count) + "次机会:"); } String password = scanner.next(); //每输入一次密码,次数+1 count++; //匹配成功,返回true if (account.equals(this.user.account) && password.equals(this.user.password)) { return true; } }while (count < 3); //代码执行到这里,说明3次都没有匹配上,返回false return false; } /** * 加载菜单 * */ private void loadMenu () { System.out.println(); System.out.println("********************欢迎使用Java银行********************"); System.out.println("1、存款 2、取款 3、转账 4、查询余额 5、退出"); } /** * 启动ATM机的方法,暴露给调用者 * */ public void start () { //先加载用户到ATM机 loadUser(); //登录 boolean flag = login(); //登录失败,直接结束业务 if (!flag) { System.out.println("您的密码3次全部输入错误,账户已被锁定,请到柜台办理相关业务"); //当方法没有任何返回值,此时return语句表示结束方法,不再往下执行 return; } System.out.println("\n登录成功!"); //向用户展示菜单 loadMenu(); //调用业务功能 service(); System.out.println("欢迎下次使用!"); } /** * 提供业务服务的方法 * */ private void service () { //记录用户的选择 int choose = 0; //通过while死循环,实现业务的多次选择,直到用户选择退出 while (true) { System.out.println("请选择您要办理对业务:"); choose = scanner.nextInt(); switch (choose) { case 1: deposit(); break; case 2: withdrawal(); break; case 3: transfer(); break; case 4: getMoney(); break; case 5: return; default: return; } //每执行完一个业务,重新将菜单展示给用户 loadMenu(); } } /** * 存款的业务方法 * */ private void deposit () { System.out.println("\n请输入您的存款数额:"); double money = scanner.nextDouble(); if (money <= 0) { System.out.println("请输入正确的数额!"); return; } this.user.money += money; System.out.println("存款成功,您目前的余额为:" + this.user.money); } /** * 取款的业务方法 * */ private void withdrawal () { System.out.println("\n请输入您的取款数额:"); double money = scanner.nextDouble(); if (money < 0) { System.out.println("请输入正确的数额!"); return; } //余额不足的情况 if (money > this.user.money) { System.out.println("您的账户余额不足"); return; } this.user.money -= money; System.out.println("取款成功,您目前的余额为:" + this.user.money); } /** * 转账的业务方法 * */ private void transfer () { System.out.println("请输入对方的账号:"); String account = scanner.next(); //假设另一个账户是55555,随便模拟一下账户不存在的情况 if (!account.equals("55555")) { System.out.println("账号不存在!"); return; } System.out.println("请输入转账数额:"); double money = scanner.nextDouble(); //余额不足的情况 if (money > this.user.money) { System.out.println("您的账户余额不足"); return; } //转出方的钱减少 this.user.money -= money; //转入方的钱增加,我们这里只有一个账户,模拟一下即可 //this.user2.money += money; System.out.println("转账成功,您目前的余额为:" + this.user.money); } /** * 查询余额 * */ private void getMoney () { System.out.println("您的账户余额为:" + this.user.money); }}