javaATM程序使用设计模式策略模式

package com.lu.atm.atmenum;

import com.lu.atm.service.ATMService;

public enum ATMEnum {
    REGISTER(1, "用户开户") {
        @Override
        public void show() {
            ATMService.register();
        }
    },
    LOGIN(2, "用户登录") {
        @Override
        public void show() {
            ATMService.login();
        }
    },
    USERAll(3, "查询所有用户") {
        @Override
        public void show() {
            ATMService.showAll();
        }
    },
    EXIT(4, "退出ATM") {
        @Override
        public void show() {
           ATMService.exit();
        }
    };

    private int code;
    private String desc;

    public static void compareParameters(int code){
        ATMEnum[] values = ATMEnum.values();
        for (ATMEnum value : values) {
            if (value.getCode() == code){
                value.show();
            }
        }
    }

    public abstract void show();

    ATMEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }
}
package com.lu.atm.atmenum;

import com.lu.atm.service.ATMService;

/**
 * 1.用户存钱
 * 2.用户取钱
 * 3.注销账户
 * 4.用户转账
 * 5.退出登录
 * 6.修改密码
 */
public enum UserEnum {
    STORE(1, "存钱") {
        @Override
        public void show() {
            ATMService.store();
        }
    },
    WITHDRAW(2, "取钱") {
        @Override
        public void show() {
            ATMService.take();
        }
    },
    CANCEL(3, "注销账户") {
        @Override
        public void show() {
            ATMService.logout();
        }
    },
    TRANSFER(4, "转账") {
        @Override
        public void show() {
            ATMService.transfer();
        }
    },
    EXIT(5, "退出登录") {
        @Override
        public void show() {
            ATMService.signOut();
        }
    },
    UPDATE(6, "修改密码") {
        @Override
        public void show() {
            ATMService.changePwd();
        }
    };
    private int code;
    private String desc;

    public abstract void show();
    UserEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static void compareParameters(int code) {
        for (UserEnum userEnum : UserEnum.values()) {
            if (userEnum.getCode() == code) {
                userEnum.show();
                return;
            }
        }
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}
package com.lu.atm.service;

import com.lu.atm.Account;
import com.lu.atm.atmenum.UserEnum;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;
import java.util.Scanner;

public class ATMService {
    private static final ArrayList<Account> list = new ArrayList<>();
    private static final Scanner sc = new Scanner(System.in);
    private static String cardId;
    private static boolean quit = true;

    /**
     * 用户开户
     */
    public static void register() {//用户开户
        Account account = new Account();
        System.out.println("请输入姓名:");
        account.setName(sc.next());

        while (true) {
            System.out.println("请输入性别:");
            String next = sc.next();
            if (next.equals("男") || next.equals("女")) {
                account.setSex(next);
                break;
            }
            System.out.println("输入有误,请重新输入");
        }

        while (true) {
            try {
                System.out.println("请输入年龄:");
                int i = sc.nextInt();
                if (i > 0 && i <= 120) {
                    account.setAge(i);
                    break;
                }
                System.out.println("输入有误,请重新输入");
            } catch (Exception e) {
                System.out.println("输入有误");
            }
        }
        while (true) {
            System.out.println("请输入密码:");
            String next = sc.next();
            System.out.println("请再次输入密码:");
            if (next.equals(sc.next())) {
                account.setCardPwd(next);
                break;
            } else {
                System.out.println("两次密码不一致");
            }
        }
        account.setBigDecimal(BigDecimal.ZERO);
        while (true) {
            String s = randomAccounts();
            if (list.stream().noneMatch(account1 -> account1.getCardId().equals(s))) {
                account.setCardId(s);
                break;
            }
        }
        list.add(account);
        System.out.println("恭喜您开户成功,您的卡号是:" + account.getCardId());
    }

    /**
     * 退出ATM
     */
    public static void exit() {
        System.out.println("谢谢使用");
        System.exit(0);
    }

    /**
     * 退出登录
     */
    public static void signOut() {
        quit = false;
    }

    /**
     * 随机生成16位卡号
     *
     * @return 16位卡号
     */
    public static String randomAccounts() {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < 16; j++) {
            sb.append(random.nextInt(0, 10));
        }
        return sb.toString();
    }

    /**
     * 用户登录
     */
    public static void login() {
        if (list.isEmpty()) {
            System.out.println("暂无用户,请先开户");
            return;
        }
        while (true) {
            System.out.println("请输入卡号:");
            String cardId = sc.next();
            for (Account account : list) {
                if (account.getCardId().equals(cardId)) {
                    int count = 3;
                    while (true) {
                        System.out.println("请输入密码:");
                        String cardPwd = sc.next();
                        if (account.getCardPwd().equals(cardPwd)) {
                            quit = true;
                            ATMService.cardId = account.getCardId();
                            System.out.println("==欢迎" + account.getName() + "登录==");
                            String s = """
                                    1.用户存钱
                                    2.用户取钱
                                    3.注销账户
                                    4.用户转账
                                    5.退出登录
                                    6.修改密码
                                    """;
                            while (quit) {
                                System.out.println(s);
                                int i = sc.nextInt();
                                if (i >= 1 && i <= 6) {
                                    UserEnum.compareParameters(i);
                                } else {
                                    System.out.println("输入有误,请重新输入");
                                }

                            }
                            return;

                        }
                        System.out.println("密码错误,还有" + (count--) + "次机会");
                        if (count == 0) {
                            System.out.println("密码错误次数过多,请重新登录");
                            return;
                        }
                    }

                }
            }
            System.out.println("账号不存在请重新输入");
        }

    }

    /**
     * 展示所有账户信息
     */
    public static void showAll() {
        if (list.isEmpty()) {
            System.out.println("暂无用户,请先开户");
            return;
        }
        for (Account account : list) {
            System.out.println("姓名:" + account.getName().charAt(0) + "**");
            System.out.println("账号:" + account.getCardId().substring(0, 12) + "****");
            System.out.println("余额:" + account.getBigDecimal());
            System.out.println("年龄:" + account.getAge());
        }
    }

    /**
     * 用户存钱
     */
    public static void store() {
        while (true) {
            System.out.println("请输入存钱金额:");
            BigDecimal bigDecimal = sc.nextBigDecimal();
            System.out.println(bigDecimal);
            if (bigDecimal.compareTo(new BigDecimal("100")) >= 0 && bigDecimal.compareTo(new BigDecimal("10000")) <= 0) {
                //每次只能存100元的整数倍
                if (bigDecimal.remainder(new BigDecimal("100")).compareTo(BigDecimal.ZERO) == 0) {
                    for (Account account : list) {
                        if (account.getCardId().equals(ATMService.cardId)) {
                            account.setBigDecimal(account.getBigDecimal().add(bigDecimal));
                            System.out.println("存钱成功,余额为:" + account.getBigDecimal());
                            return;
                        }
                    }
                }
                System.out.println("不能存零钱");
                continue;
            }
            System.out.println("存的钱必须大于一百或小于一万");
        }
    }

    /**
     * 用户取钱
     */
    public static void take() {
        for (Account account : list) {
            if (account.getCardId().equals(ATMService.cardId)) {
                if (account.getBigDecimal().compareTo(BigDecimal.ZERO) == 0) {
                    System.out.println("您还没钱请先存钱!");
                    return;
                }
            }
        }

        while (true) {
            System.out.println("请输入取钱金额:");
            BigDecimal bigDecimal = sc.nextBigDecimal();
            if (bigDecimal.remainder(new BigDecimal("100")).compareTo(BigDecimal.ZERO) == 0) {
                if (bigDecimal.compareTo(new BigDecimal("10000")) < 0) {
                    for (Account account : list) {
                        if (account.getCardId().equals(ATMService.cardId)) {
                            account.setBigDecimal(account.getBigDecimal().subtract(bigDecimal));
                            System.out.println("余额:" + account.getBigDecimal());
                            return;
                        }
                    }
                }
                System.out.println("单次取钱不能超过10000元");
                continue;
            }
            System.out.println("不能取零钱!");
        }

    }

    /**
     * 注销账户
     */
    public static void logout() {
        if (Objects.requireNonNull(idToAccount(cardId)).getBigDecimal().compareTo(BigDecimal.ZERO) > 0) {
            System.out.println("账号还有钱请先取钱!");
            return;
        }
        System.out.println("请输入密码确认是否要注销:");
        if (Objects.requireNonNull(idToAccount(cardId)).getCardPwd().equals(sc.next())) {
            list.remove(idToAccount(cardId));
            System.out.println("注销成功");
            return;
        }
        System.out.println("密码错误注销失败");
    }

    /**
     * 根据用户id返回用户信息
     *
     * @param id 用户id
     * @return 放回用户信息
     */
    public static Account idToAccount(String id) {
        for (Account account : list) {
            if (id.equals(account.getCardId())) {
                return account;
            }
        }
        return null;
    }

    /**
     * 修改密码
     */
    public static void changePwd() {
        System.out.println("请输入旧密码:");
        String next = sc.next();
        if (Objects.requireNonNull(idToAccount(cardId)).getCardPwd().equals(next)) {
            System.out.println("请输入新密码:");
            String next1 = sc.next();
            if (next1.equals(next)) {
                System.out.println("新密码不能与旧密码相同!");
            } else {
                Objects.requireNonNull(idToAccount(cardId)).setCardPwd(next1);
                System.out.println("修改成功!");
            }
        } else {
            System.out.println("密码错误!");
        }
    }

    /**
     * 转账
     */
    public static void transfer() {
        if (Objects.requireNonNull(idToAccount(cardId)).getBigDecimal().compareTo(BigDecimal.ZERO) == 0) {
            System.out.println("账号余额为0,请先存钱");
            return;
        }
        System.out.println("请输入密码:");
        String next = sc.next();
        if (Objects.requireNonNull(idToAccount(cardId)).getCardPwd().equals(next)) {
            System.out.println("请输入你要转账的账号");
            String next1 = sc.next();
            if (idToAccount(next1) != null) {
                System.out.println("请输入转账金额:");
                BigDecimal bigDecimal = sc.nextBigDecimal();
                if (bigDecimal.compareTo(new BigDecimal("100")) >= 0 && bigDecimal.compareTo(new BigDecimal("10000")) <= 0) {
                    if (bigDecimal.compareTo(Objects.requireNonNull(idToAccount(cardId)).getBigDecimal()) <= 0) {
                        if (bigDecimal.remainder(new BigDecimal("100")).compareTo(BigDecimal.ZERO) == 0) {
                            Objects.requireNonNull(idToAccount(cardId)).setBigDecimal(Objects.requireNonNull(idToAccount(cardId)).getBigDecimal().subtract(bigDecimal));
                            Objects.requireNonNull(idToAccount(next1)).setBigDecimal(Objects.requireNonNull(idToAccount(next1)).getBigDecimal().add(bigDecimal));
                            System.out.println("转账成功");
                        }
                    }
                }

            } else {
                System.out.println("账号不存在");
            }
        } else {
            System.out.println("密码输入错误请重新开始");
        }
    }


}
package com.lu.atm;

import java.math.BigDecimal;

public class Account {
    private String cardId;
    private String cardPwd;
    private String name;
    private String sex;
    private int age;
    private BigDecimal bigDecimal;

    public Account() {
    }

    public Account(String cardId, String cardPwd, String name, String sex, int age, BigDecimal bigDecimal) {
        this.cardId = cardId;
        this.cardPwd = cardPwd;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.bigDecimal = bigDecimal;
    }


    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getCardPwd() {
        return cardPwd;
    }

    public void setCardPwd(String cardPwd) {
        this.cardPwd = cardPwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public BigDecimal getBigDecimal() {
        return bigDecimal;
    }

    public void setBigDecimal(BigDecimal bigDecimal) {
        this.bigDecimal = bigDecimal;
    }

    @Override
    public String toString() {
        return "Account{" +
                "cardId='" + cardId + '\'' +
                ", cardPwd='" + cardPwd + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", bigDecimal=" + bigDecimal +
                '}';
    }
}
package com.lu.atm;

public class App {
    public static void main(String[] args) {

        ATM atm = new ATM();
        atm.start();

    }
}
package com.lu.atm;

import com.lu.atm.atmenum.ATMEnum;
import java.util.InputMismatchException;
import java.util.Scanner;

public class ATM {

    public void start(){
        Scanner scanner = new Scanner(System.in);
        int i = 0;
        while (true){
            String welcome = """
                ===欢迎使用ATM系统===
                1.用户开户
                2.用户登录
                3.展示所有账户信息
                4.退出ATM
                """;
            System.out.println(welcome);
            try {
                i = scanner.nextInt();
                scanner.nextLine(); // 消费掉换行符或其他非数字字符
                if (i >= 1 && i <= 4) {
                    ATMEnum.compareParameters(i);
                } else {
                    System.out.println("输入错误,请重新输入");
                }
            } catch (InputMismatchException e) {
                System.out.println("请输入一个有效的数字!");
                scanner.nextLine(); // 清除错误的输入
            }
        }




    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值