从零学Java 封装性 - 综合案例

封装性 - 综合案例

文章目录

  • 封装性 - 综合案例
    • 实现银行ATM功能
      • 1.类的分析
        • 1.1 User (用户类)
        • 1.2 Bank (银行类)
      • 2.Bank类的功能方法
        • 2.1 初始化, 注册
        • 2.2 登录
        • 2.3 注册, 登录界面
        • 2.4 系统菜单
      • 3.具体功能
        • 3.1 取款
        • 3.2 存款
        • 3.3 通过卡号查找用户
        • 3.4 转账
        • 3.5 显示当前余额
        • 3.6 修改密码

实现银行ATM功能

用户输入正确卡号和密码后可执行以下操作菜单如下:1.存款 2.取款 3.转账 4.查询余额 5.修改密码 0.退出

菜单样式

分析:User类(cardNo、username、password、phone、balance、identity)

Bank类主要包括以下功能:

  • 初始化用户(initial)用户登录(login)显示菜单(showMenu)
  • 存款(save)、取款(withDraw)、转账(trans)、查询余额(query)、修改密码(modifyPassword)

1.类的分析

1.1 User (用户类)
package StageOne.day09.task;

    /**
     * @author 胡昊龙
     * @version 1.0
     * @description: TODO --- User类(cardNo、username、password、phone、balance、identity)
     * @date 2023/12/29 19:09
     */
public class User {
    /**
     * 常量卡号
     */
    private static int num = 1000;
    /**
     * 属性卡号,确认身份的依据
     * 只可获取,不可更改
     */
    private final int cardNo;
    /**
     * 属性,用户名
     */
    private String username;
    /**
     * 属性,密码
     */
    private String password;
    /**
     * 属性,手机号
     */
    private String phone;
    /**
     * 属性,余额
     */
    private double balance;
    /**
     * 属性,身份证号码
     */
    private String identity;


    /**
     * 有参构造,初始化数据
     * @param username  用户名
     * @param password  密码,登录使用
     * @param phone 手机号
     * @param identity 身份证号码
     */
    public User(String username, String password, String phone, String identity) {
        //不可更改的卡号
        this.cardNo = num;
        this.username = username;
        this.password = password;
        this.phone = phone;
        //初始值为 0 的余额
        this.balance = 0;
        this.identity = identity;
        //卡号自增
        num++;
    }

    public int getCardNo() {
        return cardNo;
    }

    //各个属性的 get/set 方法 ......

    public void setIdentity(String identity) {
        this.identity = identity;
    }
}

1.2 Bank (银行类)
package StageOne.day09.task;

import java.util.Arrays;
import java.util.Scanner;

    /**
     * @author 胡昊龙
     * @version 1.0
     * @description: bank 功能类
     * Bank类主要包括以下功能
     * 初始化用户(initial)
     * 用户登录(login)
     * 显示菜单(showMenu)
     * 存款(save)、取款(withDraw)、转账(trans)、查询余额(query)、修改密码(modifyPassword)
     * @date 2023/12/29 19:37
     */
public class Bank {
    /**
     * 创建 User 数组,以存储用户数据
     */
    private User[] users;

    /**
     * size 定义存储空间
     */
    private int size;
    
    /**
     * 获取当前用户数量
     * @return 当前用户数量
     */
    public int getSize() {
        return size;
    }
}

2.Bank类的功能方法

1.初始化, 注册 2.登录 3.注册, 登录界面 4.系统菜单

2.1 初始化, 注册
    /**
    * 无参构造,初始化数组
    */
public Bank() {
    users = new User[10];
    size = 0;
}

    /**
    * 初始化,注册
    * @param user 注册新用户
    */
public void initial(User user) {
    //扩容
    if (size>= users.length) {
        users = Arrays.copyOf(users,users.length*2);
    }
    //添加进数组
    users[size] = user;
    //下标自增
    size++;
}
2.2 登录
	/**
     * 登录功能
     * @param cardNo 卡号,不可更改,自生成,唯一标识
     * @param password 密码,自定义
     * @return User 对象,供后续功能操作
     */
public User login(int cardNo , String password) {
    //遍历查找
    for (int i = 0; i < size; i++) {
        if (users[i].getCardNo() == cardNo && users[i].getPassword().equals(password)) {
            return users[i];
        }
    }
    System.out.println("账户或密码错误");
    return null;
}
2.3 注册, 登录界面

测试类, main (主方法)

package StageOne.day09.task;

import java.util.Scanner;

    /**
     * @author 胡昊龙
     * @version 1.0
     * @description: 注册、登录
     * @date 2023/12/29 20:05
     */
public class TestATM {
    public static void main(String[] args) {
        Bank bank = new Bank();
        Scanner input = new Scanner(System.in);
        boolean flag = true;
        //系统登录,注册界面
        do {
            System.out.println("==============欢迎使用本ATM机系统==============");
            System.out.println("=============1.注册 2.登录 0.退出==============");
            int n = input.nextInt();
            switch (n) {
                case 1:
                    System.out.println("请输入用户名:");
                    String username = input.next();
                    System.out.println("请输入密码:");
                    String password = input.next();
                    System.out.println("请输入电话号码:");
                    String phone = input.next();
                    System.out.println("请输入身份证号:");
                    String identity = input.next();
                    User newUser = new User(username, password, phone, identity);
                    bank.initial(newUser);
                    System.out.println("注册成功,您的卡号为:"+newUser.getCardNo());
                    break;
                case 2:
                    if (bank.getSize() != 0) {
                        System.out.println("请输入卡号:");
                        int cardNo = input.nextInt();
                        System.out.println("请输入密码:");
                        String pwd = input.next();
                        User user = bank.login(cardNo, pwd);
                        if (user != null) {
                            bank.showMenu(user);
                        }
                    } else {
                        System.out.println("当前本系统没有用户,请先注册...");
                    }
                    break;
                case 0:
                    flag = false;
                    break;
                default:
                    System.out.println("输入有无,请重新输入");
                    break;
            }
        } while (flag);
        System.out.println("欢迎下次使用本系统");
    }
}
2.4 系统菜单
	/**
     * 系统功能菜单
     * @param user 当前操作对象
     */
public void showMenu(User user) {
    boolean flag = true;
    System.out.println("登录成功,欢迎使用本系统");
    System.out.println("当前系统用户为: "+user.getUsername());
    do {
        System.out.println("======1.存款 2.取款 3.转帐 4.查询余额 5.修改密码 0.返回登录界面======");
        System.out.println("请输入:");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        switch (n) {
            case 1 :
                System.out.println("请输入您的存款金额:");
                double dp = input.nextDouble();
                if (deposit(user,dp)) {
                    System.out.println("存款成功......");
                    //显示当前用户余额
                    showBalance(user);
                }
                break;
            case 2 :
                System.out.println("请输入您的取款金额:");
                double wd = input.nextDouble();
                if (withdrawal(user,wd)) {
                    System.out.println("取款成功......");
                    //显示当前用户余额
                    showBalance(user);
                }
                break;
            case 3 :
                System.out.println("请输入转账账户的卡号: ");
                int cardNo = input.nextInt();
                System.out.println("请输入您的转账金额为: ");
                double money = input.nextDouble();
                if (transfer(user,cardNo,money)) {
                    System.out.println("转账成功......");
                    //显示当前用户余额
                    showBalance(user);
                }
                break;
            case 4 :
                System.out.println("请输入登录密码, 以验证身份...");
                String pwd = input.next();
                if (user.getPassword().equals(pwd)) {
                    showBalance(user);
                } else {
                    System.out.println("密码错误, 返回功能界面...");
                }
                break;
            case 5 :
                System.out.println("请输入你的旧密码,以验证身份...");
                String oldPwd = input.next();
                System.out.println("请输入你的新密码");
                String newPwd = input.next();
                System.out.println("请再次输入你的新密码");
                String againNewPwd = input.next();
                if (modifyPassword(user,oldPwd,newPwd,againNewPwd)) {
                    System.out.println("新密码设置成功...当前密码为: "+user.getPassword());
                    System.out.println("请妥善保存...");
                }
                break;
            case 0 :
                flag = false;
                break;
            default:
                System.out.println("输入有误,请重新输入");
                break;
        }
    } while (flag);
    System.out.println("返回登录界面......");
}

3.具体功能

存款(save)、取款(withDraw)、转账(trans)、查询余额(query)、修改密码(modifyPassword)

3.1 取款
    /**
     * 取款
     * @param user 当前操作对象
     * @param money 取款数额
     * @return ture 成功  false 失败
     */
public boolean withdrawal(User user, double money) {
    if (money<=0 || money>20000) {
        System.out.println("您所输入的金额不符合要求,必须再1~20000元之间");
        return false;
    }
    //判断余额是否充足
    if (user.getBalance()>=money) {
        user.setBalance(user.getBalance() - money);
        return true;
    } else {
        System.out.println("当前用户余额不足......");
        return false;
    }
}
3.2 存款
	/**
     * 存款
     * @param user 当前操作对象
     * @param money 存款数额
     * @return ture 成功  false 失败
     */
public boolean deposit(User user, double money) {
    if (money<=0 || money>50000) {
        System.out.println("您所输入的金额不符合要求,必须在1~50000元之间");
        return false;
    }
    user.setBalance(user.getBalance() + money);
    return true;
}
3.3 通过卡号查找用户
    /**
     * 通过卡号查找用户
     * @param cardNo 卡号,不可更改,自生成,唯一标识
     * @return User 对象,供后续功能操作
     */
public User searchByCardNo(int cardNo) {
    for (int i = 0; i < size; i++) {
        if (users[i].getCardNo() == cardNo) {
            return users[i];
        }
    }
    return null;
}
3.4 转账
	/**
     * 转账
     * @param user 当前操作对象
     * @param cardNo 转账对象,卡号,不可更改,自生成,唯一标识
     * @return ture 成功  false 失败
     */
public boolean transfer(User user, int cardNo, double money) {
    //通过卡号查找被转账用户
    User target = searchByCardNo(cardNo);
    if (target != null) {
        //判断转账账户不能为本账户
        if (target.getCardNo() != user.getCardNo()) {
            //调用取款方法
            if (withdrawal(user,money)) {
                //调用存款方法
                deposit(target,money);
                return true;
            }
        } else {
            System.out.println("转账账户不可为当前账户...");
        }
    } else {
        System.out.println("未找到您要转账的账户......");
    }
    return false;
}
3.5 显示当前余额
    /**
     * 显示当前用户余额
     * @param user 当前用户,当前操作对象
     */
public void showBalance(User user) {
    System.out.println("当前用户余额为: "+user.getBalance());
}
3.6 修改密码
    /**
     * 修改密码
     * @param user 当前操作对象
     * @param oldPwd 原始密码
     * @param newPwd 新密码
     * @param againNewPwd 确认密码
     * @return 判断是否成功
     */
public boolean modifyPassword(User user, String oldPwd, String newPwd, String againNewPwd) {
    if (user.getPassword().equals(oldPwd)) {
        if (newPwd.equals(againNewPwd)) {
            user.setPassword(newPwd);
            return true;
        } else {
            System.out.println("两次密码不一致...");
        }
    } else {
        System.out.println("旧密码输入错误...");
    }
    return false;
}

你可能感兴趣的:(从零学Java,java,开发语言)