ATM机案例2之多态的实现

ATM机案例2之多态的实现

多态就是在统一继承树上的不同对象针对同一行为的不同表现。(exdents继承或者implements实现是多态性的前提。)
格式:
父类名称 对象名=new 子类名称();
接口名称 对象名=new 实现类名称();

Account(账户类)

属性:卡号、名称、余额
行为:查询个人信息、设置余额、增加余额、减少余额(转账、存款、取款都依靠余额的增加和减少实现)

点击查看代码
public class Account{
	
	//定义私有变量,同时需要创建get、set方法供外部类调用
	
    private int card_id;
    private String name;
    private float balance;
    private String bankname;
	
	
	//查询信息
	public void queryInfo() {
        System.out.printf("卡号:%d\t名字:%s\t余额:%f\t银行:%s\r\n", card_id, name, balance,bankname);
    }

    public int getCard_id() {
        return card_id;
    }

	
	
	//余额增加
    public void inputMoney(float money) {
        balance += money;
    }

	
	
	//余额减少,余额减少时需要判断余额是否足够
    public void outputMoney(float money) {
        if (money > balance) {
            System.out.println("您的余额不足!");
        } else {
            balance -= money;
        }
    }

    public void setCard_id(int card_id) {
        this.card_id = card_id;
    }

    public String getName() {
        return name;
    }

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

    public float getBalance() {
        return balance;
    }

    public void setBalance(float balance) {
        this.balance = balance;
    }

    public String getBankname() {
        return bankname;
    }

    public void setBankname(String bankname) {
        this.bankname = bankname;
    }
}

Bank(银行类)

属性:账户
行为:开户、转账、查询所有账户

点击查看代码
public class Bank{
	static Account[] accounts = new Account[10];
    static int  count = 0;

	//开户方法
    public void createAccount(int card_id, String name, float balance) {
        if (findById(card_id) == null) {
            Account account = new Account();
            account.setCard_id(card_id);
            account.setName(name);
            account.setBalance(balance);

            Scanner scanner = new Scanner(System.in);
            System.out.println("请选择您开户的银行:\n1、中国工商银行\t2、中国招商银行\t3、中国人民银行\r");
            int choose = scanner.nextInt();
            switch (choose) {
                case 1:
                    account.setBankname("中国工商银行");
                    break;
                case 2:
                    account.setBankname("中国招商银行");
                    break;
                case 3:
                    account.setBankname("中国人民银行");
                    break;
                default:
                    System.out.println("非法输入!");
                    break;
            }

            accounts[count] = account;
            count++;
        } else {
            System.out.println("该卡号已被创建!");
        }

    }

	//转账方法,根据具体的不同银行,调用不同的转账方法
    public void transfer(int fromId, int toId, float money) {
        Account from = findById(fromId);
        Account to = findById(toId);

        switch (from.getBankname()) {
            case "中国工商银行":
                Bank icbcBank = new ICBCBank();
                icbcBank.transfer(fromId, toId, money);
                break;
            case "中国招商银行":
                Bank cmbBank = new CMBBank();
                cmbBank.transfer(fromId, toId, money);
                break;
            case "中国人民银行":
                Bank pbcBank = new PBCBank();
                pbcBank.transfer(fromId, toId, money);
                break;
        }
    }

	//查询方法,展示所有账户信息
    public void show() {
        if (accounts[0] == null) {
            System.out.println("暂无账号记录!");
        } else {
            for (int i = 0; i < count; i++) {
                Account account = accounts[i];
                account.queryInfo();
            }
        }
    }

    public Account findById(int Id) {
        for (int i = 0; i <count; i++) {
            Account account = accounts[i];
            if (Id == account.getCard_id()) {
                return account;
            }
        }
        return null;
    }
	}

ATM(ATM机类)

属性:银行
行为:接收用户输入

点击查看代码
public class ATM{
	
	//实例化一个银行对象
	Bank bank = new Bank();

	
	//调用菜单方法
    public static void main(String[] args) {
        ATM atm = new ATM();
        atm.displayMenu();
    }

	
	//菜单方法
    private void displayMenu() {
        while (true) {
            System.out.println("1.开户\t2.转账\t3.查询\t0.退出");
            int choose = 0;
            Scanner scanner = new Scanner(System.in);
            try {
                choose = scanner.nextInt();
                if (choose == 0) {
                    System.out.println("已退出!");
                    scanner.close();
                    break;
                }
                switch (choose) {
                    case 1:
                        System.out.println("请依次输入卡号、姓名、余额:");
                        bank.createAccount(scanner.nextInt(), scanner.next(), scanner.nextFloat());
                        break;
                    case 2:
                        System.out.println("请依次输入汇款卡号、收款卡号、转账金额:");
	
						//调用银行的转账方法
                        bank.transfer(scanner.nextInt(), scanner.nextInt(), scanner.nextFloat());
                        break;
                    case 3:
                        bank.show();
                        break;
                    default:
                        System.out.println("非法输入!");
                        break;
                }

            } catch (Exception e) {
                if (e instanceof NullPointerException) {
                    System.out.println("存在非法卡号!");
                } else {
                    System.out.println("非法输入!");
                }
            }
        }
    }
	}

具体银行类

CMBBank(招商银行类)
public class CMBBank extends Bank {
    //招商银行  不收手续费
	//重写父类(银行类)的转账方法
    @Override
    public void transfer(int fromId, int toId, float money) {
        Account from = super.findById(fromId);
        Account to = super.findById(toId);
        if (money > from.getBalance()) {
            System.out.println("余额不足,转账失败");
        } else {
            from.outputMoney(money);
            to.inputMoney(money);
            System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
                    from.getBalance(),to.getBalance(),0.0);
        }
    }
}
ICBCBank(工商银行类)
public class ICBCBank extends Bank {
    //中国工商银行   转账收手续费2元每次
	//重写父类(银行类)的转账方法
    @Override
    public void transfer(int fromId, int toId, float money) {
        Account from = super.findById(fromId);
        from.queryInfo();
        Account to = super.findById(toId);
        to.queryInfo();
        if (money + 2 > from.getBalance()) {
            System.out.println("余额不足,转账失败");
        } else {
            from.outputMoney(money + 2);
            to.inputMoney(money);
            System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
                    from.getBalance(), to.getBalance(), 2.0);
        }
    }
}
PBCBank(人民银行类)
public class PBCBank extends Bank {
    //中国人民银行   收取手续费为转账金额1%
	//重写父类(银行类)的转账方法
    @Override
    public void transfer(int fromId, int toId, float money) {
        Account from = super.findById(fromId);
        Account to = super.findById(toId);
        if ((money/100+money) > from.getBalance())  {
            System.out.println("余额不足,转账失败");
        } else {
            from.outputMoney(money/100+money);
            to.inputMoney(money);
            System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
                    from.getBalance(),to.getBalance(),money/100);
        }
    }
}
posted @ 2021-10-22 16:34  边缘气息  阅读(39)  评论(0)    收藏  举报