Top

JAVA OOP DAY06

  1. ATM机系统

1 ATM机系统

1.1 问题

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

1. 中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。

2. 如果为农行的卡,可以实现支付电话费功能。界面交互效果如下:

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

图-1

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

图-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机所实现的功能。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义类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();

	}
}

运行上述代码后,会发现农行的卡可以实现支付电话费功能,而工商银行的卡则不能实现支付电话费功能。

1.4 完整代码

本案例中,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();

	}
}