在案例“ 银行卡系统(实现银联接口) ”基础上实现本案例,本案例要求实现中国农业银行的ATM系统,详细要求如下:
1. 中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。
2. 如果为农行的卡,可以实现支付电话费功能。界面交互效果如下:
如果为农行的银行卡界面交互效果如图-1所示。
图-1
观察图-1可以发现,农业银行的卡可以实现缴费功能。如果为其它银行的银联卡,界面交互效果如图-2所示。
图-2
观察图-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机所实现的功能。
实现此案例需要按照如下步骤进行。
步骤一:定义类ABCATM
定义名为ABCATM的类,表示农行的ATM机系统,代码如下所示:
/** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { }
步骤二:定义属性card表示银联卡
在ABCATM类中,定义属性card,该属性的类型为UnionPay,表示银联卡。代码如下所示:
/** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { #cold_bold private UnionPay card; }
步骤三:实现ATM机插口操作
在ABCATM类中,定义方法insertCard,实现向ATM机插入银联卡的操作。在该方法中,将card进行初始化,即表示插卡操作,代码如下所示:
import java.util.Scanner; /** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; #cold_bold public void insertCard(UnionPay userCard){ #cold_bold if (card == null) { #cold_bold card = userCard; #cold_bold } #cold_bold } }
步骤四:实现取卡操作
在ABCATM类中,定义方法outCard,实现从ATM机取出银联卡的操作。在该方法中,将card的值设置为null,即表示取卡操作,代码如下所示:
/** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard){ if (card == null) { card = userCard; } } #cold_bold private void outCard(){ #cold_bold card = null; #cold_bold } }
步骤五:实现查询余额功能
在ABCATM类中,定义showBalance方法实现查询余额功能,在该方法中调用银联接口UnionPay的getBalance方法即可,代码如下所示:
/** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard){ if (card == null) { card = userCard; } } private void outCard(){ card = null; } #cold_bold private void showBalance(){ #cold_bold System.out.println("当前余额是:" + card.getBalance()); #cold_bold } }
步骤六:实现取款功能
在ABCATM类中,定义takeMoney方法实现取款功能,在该方法中调用银联接口UnionPay的drawMoney方法即可,代码如下所示:
#cold_boldimport java.util.Scanner; /** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard){ if (card == null) { card = userCard; } } private void outCard(){ card = null; } private void showBalance(){ System.out.println("当前余额是:" + card.getBalance()); } #cold_bold #cold_bold private void takeMoney(){ #cold_bold Scanner input = new Scanner(System.in); #cold_bold System.out.println("请输入取款数目:"); #cold_bold double number = Double.parseDouble(input.next()); #cold_bold if(card.drawMoney(number)){ #cold_bold System.out.println("取款成功"); #cold_bold }else{ #cold_bold System.out.println("取款失败"); #cold_bold } #cold_bold } }
步骤七:实现支付电话费功能
在ABCATM类中,定义payTelBill方法实现支付电话费功能,在该方法中,首先判断插入的银联卡是否为农行的卡,如果是农行的卡,则调用农行接口ABC的payTelBill方法;否则,提示信息"您的卡不是农业银行卡,无法完成缴费",代码如下所示:
import java.util.Scanner; /** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard){ if (card == null) { card = userCard; } } private void outCard(){ card = null; } private void showBalance(){ System.out.println("当前余额是:" + card.getBalance()); } private void takeMoney(){ Scanner input = new Scanner(System.in); System.out.println("请输入取款数目:"); double number = Double.parseDouble(input.next()); if(card.drawMoney(number)){ System.out.println("取款成功"); }else{ System.out.println("取款失败"); } } #cold_bold private void payTelBill(){ #cold_bold Scanner input = new Scanner(System.in); #cold_bold if(card instanceof ABC){ #cold_bold ABC abcCard = (ABC)card; #cold_bold System.out.println("请输入电话号码:"); #cold_bold String telNum = input.next(); #cold_bold System.out.println("请输入缴费额:"); #cold_bold double sum = Double.parseDouble(input.next()); #cold_bold if(abcCard.payTelBill(telNum,sum)){ #cold_bold System.out.println("缴费成功"); #cold_bold }else{ #cold_bold System.out.println("缴费失败"); #cold_bold } #cold_bold #cold_bold #cold_bold }else{ #cold_bold System.out.println("您的卡不是农业银行卡,无法完成缴费"); #cold_bold } #cold_bold } }
步骤八:实现ATM机的菜单功能
在ABCATM类中,定义allMenu方法实现农行ATM机的菜单功能,代码如下所示:
import java.util.Scanner; /** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard){ if (card == null) { card = userCard; } } private void outCard(){ card = null; } private void showBalance(){ System.out.println("当前余额是:" + card.getBalance()); } private void takeMoney(){ Scanner input = new Scanner(System.in); System.out.println("请输入取款数目:"); double number = Double.parseDouble(input.next()); if(card.drawMoney(number)){ System.out.println("取款成功"); }else{ System.out.println("取款失败"); } } private void payTelBill(){ Scanner input = new Scanner(System.in); if(card instanceof ABC){ ABC abcCard = (ABC)card; System.out.println("请输入电话 号码:"); String telNum = input.next(); System.out.println("请输入缴费额:"); double sum = Double.parseDouble(input.next()); if(abcCard.payTelBill(telNum,sum)){ System.out.println("缴费成功"); }else{ System.out.println("缴费失败"); } }else{ System.out.println("您的卡不是农业银行卡,无法完成缴费"); } } #cold_bold public void allMenu(){ #cold_bold Scanner input = new Scanner(System.in); #cold_bold #cold_bold System.out.println("请输入密码:"); #cold_bold String pwd = input.next(); #cold_bold #cold_bold if(card.checkPwd(pwd)){ #cold_bold System.out.println("请选择功能:\n 1.查看余额 2.取款 3.缴电话费"); #cold_bold int choice = Integer.parseInt(input.next()); #cold_bold switch(choice){ #cold_bold case 1: #cold_bold showBalance(); #cold_bold break; #cold_bold case 2: #cold_bold takeMoney(); #cold_bold break; #cold_bold case 3: #cold_bold payTelBill(); #cold_bold break; #cold_bold default: #cold_bold System.out.println("非法输入"); #cold_bold } #cold_bold }else{ #cold_bold System.out.print("密码错误"); #cold_bold } #cold_bold this.outCard(); #cold_bold } }
步骤九:测试
构建测试类TestATM,测试农行ATM机所实现的功能,代码如下所示:
/** * 测试接口多态 */ public class TestATM { public static void main(String[] args) { ABCATM atm =new ABCATM(); //ICBCImpl icbc = new ICBCImpl(3000, "123456");//工商银行的卡 ABCImpl abc = new ABCImpl(1000, "123456");//农业银行的卡 //atm.insertCard(icbc); atm.insertCard(abc); atm.allMenu(); } }
运行上述代码后,会发现农行的卡可以实现支付电话费功能,而工商银行的卡则不能实现支付电话费功能。
本案例中,ABCATM类的完整代码如下所示:
import java.util.Scanner; /** * ABCATM机类,用于描述模拟插入银行卡后的操作 */ public class ABCATM { private UnionPay card; public void insertCard(UnionPay userCard) { if (card == null) { card = userCard; } } private void outCard() { card = null; } private void showBalance() { System.out.println("当前余额是:" + card.getBalance()); } private void takeMoney() { Scanner input = new Scanner(System.in); System.out.println("请输入取款数目:"); double number = Double.parseDouble(input.next()); if (card.drawMoney(number)) { System.out.println("取款成功"); } else { System.out.println("取款失败"); } } private void payTelBill() { Scanner input = new Scanner(System.in); if (card instanceof ABC) { ABC abcCard = (ABC) card; System.out.println("请输入电话 号码:"); String telNum = input.next(); System.out.println("请输入缴费额:"); double sum = Double.parseDouble(input.next()); if (abcCard.payTelBill(telNum, sum)) { System.out.println("缴费成功"); } else { System.out.println("缴费失败"); } } else { System.out.println("您的卡不是农业银行卡,无法完成缴费"); } } public void allMenu() { Scanner input = new Scanner(System.in); System.out.println("请输入密码:"); String pwd = input.next(); if (card.checkPwd(pwd)) { System.out.println("请选择功能:\n 1.查看余额 2.取款 3.缴电话费"); int choice = Integer.parseInt(input.next()); switch (choice) { case 1: showBalance(); break; case 2: takeMoney(); break; case 3: payTelBill(); break; default: System.out.println("非法输入"); } } else { System.out.print("密码错误"); } this.outCard(); } }
TestATM类完整代码如下所示:
/** * 测试接口多态 */ public class TestATM { public static void main(String[] args) { ABCATM atm =new ABCATM(); //ICBCImpl icbc = new ICBCImpl(3000, "123456");//工商银行的卡 ABCImpl abc = new ABCImpl(1000, "123456");//农行的卡 //atm.insertCard(icbc); atm.insertCard(abc); atm.allMenu(); } }