银行取款模拟系统是Java面向对象编程的经典实践项目,通过模拟真实的ATM取款流程,能够帮助开发者深入理解类的封装、对象的创建与交互、业务逻辑的分层设计等核心知识点。下面我们将从需求梳理、类结构设计、核心代码实现三个部分展开说明。

一、需求分析
在开发银行取款模拟系统前,我们首先需要明确核心功能需求:
- 用户需要输入正确的银行卡号和密码才能登录系统
- 登录成功后可以查询当前账户余额
- 支持输入取款金额,系统需要校验金额合法性(是否为正数、是否超过余额、是否符合取款面额要求)
- 取款成功后需要更新账户余额,并提示取款成功
- 支持退出系统操作
二、面向对象类设计
根据需求,我们可以将系统拆分为三个核心类,每个类负责不同的职责,符合单一职责原则:
1. 账户类(Account)
封装账户的核心属性与基础操作,属性包含卡号、密码、余额,方法包含密码校验、余额查询、余额扣减。
2. 银行服务类(BankService)
负责处理核心业务逻辑,比如用户登录校验、取款操作的前置校验与执行、余额查询的转发。
3. 主程序类(ATMMain)
负责用户交互,接收用户输入的内容,调用银行服务类的方法,并输出对应的操作结果。
三、核心代码实现
1. 账户类代码
账户类通过private修饰属性实现封装,对外提供公共的访问方法:
public class Account {
// 卡号
private String cardNo;
// 密码
private String password;
// 余额
private double balance;
// 构造方法
public Account(String cardNo, String password, double balance) {
this.cardNo = cardNo;
this.password = password;
this.balance = balance;
}
// 校验密码是否正确
public boolean checkPassword(String inputPwd) {
return this.password.equals(inputPwd);
}
// 获取余额
public double getBalance() {
return this.balance;
}
// 扣减余额
public void deductBalance(double amount) {
this.balance -= amount;
}
// 获取卡号
public String getCardNo() {
return cardNo;
}
}
2. 银行服务类代码
银行服务类实现核心业务逻辑的校验与处理:
public class BankService {
// 模拟存储账户信息,实际项目中会使用数据库
private Account account;
public BankService(Account account) {
this.account = account;
}
// 用户登录校验
public boolean login(String inputCardNo, String inputPwd) {
if (!account.getCardNo().equals(inputCardNo)) {
return false;
}
return account.checkPassword(inputPwd);
}
// 取款操作
public String withdraw(double amount) {
// 校验取款金额是否为正数
if (amount <= 0) {
return "取款金额必须大于0";
}
// 校验取款金额是否为100的整数倍
if (amount % 100 != 0) {
return "取款金额必须是100的整数倍";
}
// 校验余额是否充足
if (amount > account.getBalance()) {
return "余额不足,无法完成取款";
}
// 扣减余额
account.deductBalance(amount);
return "取款成功,本次取款金额为:" + amount + "元,当前余额为:" + account.getBalance() + "元";
}
// 查询余额
public double queryBalance() {
return account.getBalance();
}
}
3. 主程序交互类代码
主程序类通过Scanner接收用户输入,完成整个流程的交互:
import java.util.Scanner;
public class ATMMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 初始化一个测试账户
Account testAccount = new Account("6222021234567890", "123456", 5000.0);
BankService bankService = new BankService(testAccount);
System.out.println("欢迎使用银行ATM取款系统");
// 登录流程
System.out.print("请输入银行卡号:");
String cardNo = scanner.nextLine();
System.out.print("请输入密码:");
String pwd = scanner.nextLine();
if (!bankService.login(cardNo, pwd)) {
System.out.println("卡号或密码错误,登录失败");
return;
}
System.out.println("登录成功,欢迎您!");
// 操作菜单
while (true) {
System.out.println("n请选择操作:");
System.out.println("1. 查询余额");
System.out.println("2. 取款");
System.out.println("3. 退出系统");
System.out.print("请输入操作编号:");
int choice = scanner.nextInt();
switch (choice) {
case 1:
double balance = bankService.queryBalance();
System.out.println("当前账户余额为:" + balance + "元");
break;
case 2:
System.out.print("请输入取款金额:");
double amount = scanner.nextDouble();
String result = bankService.withdraw(amount);
System.out.println(result);
break;
case 3:
System.out.println("感谢使用,再见!");
scanner.close();
return;
default:
System.out.println("无效的操作编号,请重新输入");
}
}
}
}
四、运行测试说明
运行主程序后,输入正确的卡号6222021234567890和密码123456即可登录系统。选择取款操作时,如果输入50元,系统会提示取款金额必须是100的整数倍;如果输入6000元,会提示余额不足;输入3000元则会取款成功,同时更新余额信息。整个流程完整模拟了真实ATM的取款逻辑,体现了面向对象编程中类之间的协作关系。