Java入门第69课——ATM机系统
希望大家多评论和点赞,这样我写的更有动力
ATM机系统
问题
在案例"银行卡系统(实现银联接口)"基础上实现本案例,本案例要求实现中国农业银行的ATM系统,详细要求如下:
1.中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。
2.如果为农行的卡,可以实现支付电话费功能。界面交互效果如下:
如果为农行的银行卡界面交互效果如图-1所示。
观察图-1可以发现,农业银行的卡可以实现缴费功能。如果为其它银行的银行卡,界面交互效果如图-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{
private UnionPay card;
}
步骤三:实现ATM机插口操作
在ABCATM类中,定义方法insertCard,实现向ATM机插入银联卡的操作。在该方法中,将card进行初始化,即表示插卡操作,代码如下所示:
import java.util.Scanner;
/**
*ABCATM机类,用于描述模拟插入银行卡后的操作
*/
public class ABCATM{
private UnionPay card;
public void insertCard(UnionPay userCard){
if(card==null){
card=userCard;
}
}
}
步骤四:实现取卡操作
在ABCATM类中,定义方法outCard,实现从ATM机取出银联卡的操作。在该方法中,将card的值设置为null,即表示取卡操作,代码如下所示:
/**
*ABCATM机类,用于描述模拟插入银行卡后的操作
*/
public class ABCATM{
private UnionPay card;
public void insertCard(UnionPay userCard){
if(card==null){
card=userCard;
}
}
private void outCard(){
card=null;
}
}
步骤五:实现查询余额功能
在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;
}
private void showBalance(){
System.out.println("当前余额是:"+card.getBalance());
}
}
步骤六:实现取款功能
在ABCATM类中,定义takeMoney方法实现取款功能,在该方法中调用银联接口UnionPay的drawMoney方法即可,代码如下所示:
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("取款失败");
}
}
}
步骤七:实现支付电话费功能
在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("取款失败");
}
}
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("您的卡不是农业银行卡,无法完成缴费");
}
}
}
步骤八:实现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("您的卡不是农业银行卡,无法完成缴费");
}
}
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,测试农行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();
}
}
运行上述代码后,会发现农行的卡可以实现支付电话费功能,而工商银行的卡则不能实现支付电话费功能。
扫描关注我吧: