1 ATM机系统
1.1 问题
在案例“ 银行卡系统(实现银联接口) ”基础上实现本案例,本案例要求实现中国农业银行的ATM系统,详细要求如下:

  1. 中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。
  2. 如果为农行的卡,可以实现支付电话费功能。界面交互效果如下:

如果为农行的银行卡界面交互效果如图-1所示。

银行系统架构怎么写 银行系统功能结构图_银行系统架构怎么写

图-1

观察图-1可以发现,农业银行的卡可以实现缴费功能。如果为其它银行的银联卡,界面交互效果如图-2所示。

银行系统架构怎么写 银行系统功能结构图_java_02

图-2

观察图-2可以发现,工商银行的卡不能实现缴费功能。

1.2 方案
要实现农行的ATM机系统,解决方案如下:

  1. 定义名为ABCATM的类,表示农行的ATM机系统。
  2. 在ABCATM类中,定义属性card,该属性的类型为UnionPay,表示不同银行的银联卡。
  3. 在ABCATM类中,定义方法insertCard,实现向ATM机插入银联卡的操作。
  4. 在ABCATM类中,定义方法outCard,实现从ATM机取出银联卡的操作。
  5. 在ABCATM类中,定义方法showBalance,实现查询余额功能,在该方法中调用银联接口UnionPay的getBalance方法即可。
  6. 在ABCATM类中,定义takeMoney方法,实现取款功能,在该方法中调用银联接口UnionPay的drawMoney方法即可。
  7. 在ABCATM类中,定义payTelBill方法,实现支付电话费功能,在该方法中,首先判断插入的银联卡是否为农行的卡, 如果是农行的卡,则调用农行接口ABC的payTelBill方法;否则,提示信息"您的卡不是农业银行卡,无法完成缴费"。
  8. 在ABCATM类中,定义allMenu方法,实现农行ATM机的菜单。
  9. 构建测试类,测试农行ATM机所实现的功能。
    代码实现:
import java.util.Scanner;
/**建行的取款机应该有4中功能 1.getMoney  2.drawMoney  3.checkPwd  4.payTellBill(仅限建行卡使用) */
public class ABCATM {

    private UnionPay card;
    //插卡
    public void insertCard(UnionPay card){
        if(this.card==null){
            this.card=card;
        }
    }
    //取卡
    private void outCard(){
        card=null;
    }
    //查询余额
    private void showBalance(){
        System.out.println("你的卡上余额为:"+card.getMoney()+"元");
    }
    //取钱
    private void takeMoney(){
        Scanner scan =new Scanner(System.in);
        System.out.println("请输入取钱金额:");
        double number=Double.parseDouble(scan.next());
        if(card.drawMoney(number)){
            System.out.println("取钱操作成功!");
        }else{
            System.out.println("金额不足,取钱失败");
        }
    }
    //检查密码
    private void payTellBill(){
        if(card instanceof ABCImpl){
            Scanner scan = new Scanner(System.in);
            ABCImpl abc = (ABCImpl)card;
            System.out.println("请输入电话号码:");
            String pnoneNumber=scan.nextLine();
            System.out.println("请输入金额:");
            double number=Double.parseDouble(scan.next());
            if(abc.payTellBill(pnoneNumber,number)){
                System.out.println("支付成功");
            }else{
                System.out.println("支付失败");
            }
        }else{
            System.out.println("您的卡不是建行卡,不能支付电话费");
        }
    }
    //密码判断
    private boolean judgPwd(){
        Scanner scan = new Scanner(System.in);
        int count=0;
        for(;;){
            System.out.println("请输入密码:");
            String pwd=scan.nextLine();
            if(card.checkPwd(pwd)){
                System.out.println("密码输入正确!");
                return true;
            }else{
                count++;
            }
            if(count==3){
                System.out.println("密码输入3次错误,退出程序!");
                return false;
            }
        }
    }
    //显示菜单
    public void allMenu(){
        Scanner scan = new Scanner(System.in);
        if(judgPwd()){
            for(;;){
                System.out.println("请输入您的操作:1.查询余额     2.取款    3.支付话费    0.退出 ");
                int choice=Integer.parseInt(scan.next());
                switch(choice){
                    case 0:
                        System.out.println("退出程序!");
                        this.outCard();
                        return;
                    case 1:
                        showBalance();
                        break;
                    case 2:
                        takeMoney();
                        break;
                    case 3:
                        payTellBill();
                        break;
                    default:
                        System.out.println("非法操作!");
                }
            }
        }else{
            this.outCard();
            return;
        }
    }

}

最后我们写一个测试:

/**
 * 测试接口多态
 */
public class TestATM {
    public static void main(String[] args) {
        ABCATM atm =new ABCATM();
        //ICBCImpl icbc = new ICBCImpl(3000, "123456");//工商银行的卡
        ABCImpl  abc  = new ABCImpl("123456", 1000);//农业银行的卡

        //atm.insertCard(icbc);
        atm.insertCard(abc);
        atm.allMenu();
    }
}