ATM柜员机模拟程序java
时间: 2025-01-02 12:30:54 浏览: 16
### Java 实现 ATM 柜员机模拟程序
#### 创建 Bank 类用于管理账户信息
为了实现一个完整的ATM系统,首先需要创建`Bank`类来管理和存储用户的银行账户信息。
```java
import java.util.HashMap;
import java.util.Map;
public class Bank {
private Map<String, Account> accounts = new HashMap<>();
public void addAccount(Account account) {
accounts.put(account.getAccountNumber(), account);
}
public boolean authenticate(String accountNumber, String pin) {
var account = accounts.get(accountNumber);
if (account != null && account.validatePin(pin)) {
return true;
}
return false;
}
public double getBalance(String accountNumber) {
return accounts.get(accountNumber).getBalance();
}
public void withdraw(String accountNumber, double amount) {
accounts.get(accountNumber).withdraw(amount);
}
public void deposit(String accountNumber, double amount) {
accounts.get(accountNumber).deposit(amount);
}
}
```
此部分展示了如何定义一个简单的`Bank`类[^1]。该类负责维护一系列账户对象,并提供基本的操作接口如验证登录、查询余额以及存取款等功能。
#### 定义 Account 类表示具体账户实体
接着定义`Account`类作为单个客户账户的具体表现形式:
```java
public class Account {
private final String accountNumber;
private final String pin;
private double balance;
public Account(String accountNumber, String pin, double initialDeposit) {
this.accountNumber = accountNumber;
this.pin = pin;
this.balance = initialDeposit;
}
public String getAccountNumber() {return accountNumber;}
public boolean validatePin(String enteredPin) {
return pin.equals(enteredPin);
}
public synchronized void withdraw(double amount) {
if (amount <= balance) {
balance -= amount;
} else {
throw new IllegalArgumentException("Insufficient funds");
}
}
public synchronized void deposit(double amount) {
if (amount > 0) {
balance += amount;
} else {
throw new IllegalArgumentException("Invalid deposit amount");
}
}
public double getBalance() {
return balance;
}
}
```
这段代码实现了具体的账户行为,包括初始化时设置账号密码及初始存款金额;提供了校验PIN码的方法;还有同步控制下的提款和存款功能以防止并发访问带来的问题。
#### 构建图形界面(GUI)
对于更友好的用户体验来说,可以采用Swing库构建图形化用户界面(GUI),使得操作更加直观方便。下面是一个简化版的主窗口设计示例:
```java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ATMMachine extends JFrame implements ActionListener {
private JTextField txtAccountNo;
private JPasswordField pwdField;
private JButton btnLogin;
private JLabel lblMessage;
// ... GUI组件声明...
public static void main(String[] args){
EventQueue.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
ATMMachine frame = new ATMMachine();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
});
}
@Override
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == btnLogin){
String accNum = txtAccountNo.getText().trim();
char[] passwordChars = pwdField.getPassword();
String passStr = new String(passwordChars);
if(bank.authenticate(accNum,passStr)){
JOptionPane.showMessageDialog(this,"Welcome!");
dispose(); // 关闭当前窗体
// 打开新页面...
}else{
lblMessage.setText("Incorrect credentials.");
}
pwdField.setText("");
}
// 处理其他按钮点击事件...
}
}
```
这里给出了一个基础框架,其中包含了登录认证的功能。当用户输入正确的凭证后会显示欢迎消息并跳转到下一个操作界面,在实际应用中还需要继续完善各个子模块之间的导航逻辑[^2]。
#### 数据持久层连接数据库
最后要提到的是数据持久性的解决方案。通常情况下我们会选择关系型数据库管理系统(RDBMS)来进行长期的数据保存工作。利用Apache Commons DbUtils工具包中的QueryRunner可以帮助快速执行SQL语句而无需手动处理资源关闭等问题:
```java
// 假设已经配置好了Druid连接池
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
String sql = "INSERT INTO Accounts VALUES (?, ?, ?)";
Object[] params = {"ACC123", "PASSWD", 500};
try {
int affectedRows = queryRunner.update(sql, params);
} catch (SQLException ex) {
Logger.getLogger(ATMMachine.class.getName()).log(Level.SEVERE, null, ex);
}
```
上述片段说明了怎样借助DbUtils完成向表内插入记录的任务。当然这只是一个非常粗略的例子,真实环境中应当考虑更多因素比如异常捕获机制、事务管理等[^3]。
阅读全文