1 ATM机系统
1.1 问题
在案例“ 银行卡系统(实现银联接口) ”基础上实现本案例,本案例要求实现中国农业银行的ATM系统,详细要求如下:
-
中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。
-
如果为农行的卡,可以实现支付电话费功能。界面交互效果如下:
如果为农行的银行卡界面交互效果如图-1所示。
图-1
观察图-1可以发现,农业银行的卡可以实现缴费功能。如果为其它银行的银联卡,界面交互效果如图-2所示。
图-2
观察图-2可以发现,工商银行的卡不能实现缴费功能。
1.2 方案
要实现农行的ATM机系统,解决方案如下:
-
定义名为ABCATM的类,表示农行的ATM机系统。
-
在ABCATM类中,定义属性card,该属性的类型为UnionPay,表示不同银行的银联卡。
-
在ABCATM类中,定义方法insertCard,实现向ATM机插入银联卡的操作。
-
在ABCATM类中,定义方法outCard,实现从ATM机取出银联卡的操作。
-
在ABCATM类中,定义方法showBalance,实现查询余额功能,在该方法中调用银联接口UnionPay的getBalance方法即可。
-
在ABCATM类中,定义takeMoney方法,实现取款功能,在该方法中调用银联接口UnionPay的drawMoney方法即可。
-
在ABCATM类中,定义payTelBill方法,实现支付电话费功能,在该方法中,首先判断插入的银联卡是否为农行的卡, 如果是农行的卡,则调用农行接口ABC的payTelBill方法;否则,提示信息"您的卡不是农业银行卡,无法完成缴费"。
-
在ABCATM类中,定义allMenu方法,实现农行ATM机的菜单。
-
构建测试类,测试农行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();
}
}