銀行卡系統
一、功能描述
- 要求實現銀行卡系統的銀聯接口,詳細要求如下
- 銀聯接口,用於描述銀聯統一制定的規則,該接口提供檢查密碼,取錢以及查詢餘額方法
- 工商銀行接口,用於描述工行發行的卡片功能,在滿足銀聯接口的規則基礎上,增加了在線支付功能。
- 農業銀行接口,用於描述農行發行的卡片功能,在滿足銀聯接口的規則基礎上,增加了支付電話費的功能。另外,農行的卡可以透支5000元。
- 實現工行接口和農行接口,並進行測試
二、實現代碼
1、定義銀聯接口
UnionPay.java
package com.feonix;
/**
* 銀聯接口
*
* @author FeoniX
*
*/
public interface UnionPay {
/**
* 密碼認證
*
* @param passwd
*/
boolean auth(String passwd);
/**
* 取錢
*
* @param money
*/
void drawMoney(double money, String passwd);
/**
* 查詢餘額
*/
void queryBalance();
}
2、定義工商銀行接口,繼承銀聯接口
ICBC.java
package com.feonix;
/**
* 工商銀行接口
*
* @author FeoniX
*
*/
public interface ICBC extends UnionPay {
/**
* 在線支付
*
* @param money
* @param passwd
*/
void onlinePay(double money, String passwd);
}
3、定義農業銀行接口,繼承銀聯接口
ABC.java
package com.feonix;
/**
* 農業銀行接口
*
* @author FeoniX
*
*/
public interface ABC extends UnionPay {
/** 透支額度 */
public static final double OVERDRAFT = 5000;
/**
* 充值話費
* @param money
*/
void recharge(double money, String passwd);
}
4、定義銀行類,實現銀聯接口
Bank.java
package com.feonix;
import java.util.Scanner;
/**
* 銀行類 實現 銀聯 接口
*
* @author FeoniX
*
*/
public abstract class Bank implements UnionPay {
/** 銀行卡號 */
private int id;
/** 銀行卡密碼 */
private String passwd;
/** 銀行卡餘額 */
private double balance;
public Bank(int id, String passwd, double balance) {
this.id = id;
this.passwd = passwd;
this.balance = balance;
}
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
boolean flag = true;
String passwd;
double money;
Bank icbc = null, abc = null;
while (flag) {
System.out.println("***************歡迎使用銀行業務系統****************");
System.out.println("請選擇銀行:(工商銀行請扣1 農業銀行請扣2 退出請扣0)");
int bank = key.nextInt();
if (bank == 0) {
break;
}
System.out.println("請輸入卡號:");
int id = key.nextInt();
System.out.println("請輸入密碼:");
passwd = key.next();
boolean flag2 = true;
switch (bank) {
case 1:
icbc = new ICBCBank(id, "qwer123", 5000);
if (!icbc.auth(passwd)) {
System.out.println("密碼錯誤,請重試\n");
continue;
}
while (flag2) {
System.out.println("請選擇操作:(餘額查詢請扣1 取款請扣2 在線支付請扣3 返回上一級菜單請扣0)");
int code = key.nextInt();
switch (code) {
case 1:
icbc.queryBalance();
break;
case 2:
System.out.println("請輸入取款金額:");
money = key.nextDouble();
System.out.println("請輸入密碼:");
passwd = key.next();
icbc.drawMoney(money, passwd);
break;
case 3:
System.out.println("請輸入在線支付金額:");
money = key.nextDouble();
System.out.println("請輸入密碼:");
passwd = key.next();
icbc.onlinePay(money, passwd);
break;
case 0:
flag2 = false;
break;
default:
System.out.println("指令無效,請重新輸入\n");
}
}
break;
case 2:
abc = new ABCBank(id, "qwer456", 3000);
if (!abc.auth(passwd)) {
System.out.println("密碼錯誤,請重試\n");
continue;
}
while (flag2) {
System.out.println("請選擇操作:(餘額查詢請扣1 取款請扣2 話費充值請扣3 返回上一級菜單請扣0)");
int code = key.nextInt();
switch (code) {
case 1:
abc.queryBalance();
break;
case 2:
System.out.println("請輸入取款金額:");
money = key.nextDouble();
System.out.println("請輸入密碼:");
passwd = key.next();
abc.drawMoney(money, passwd);
break;
case 3:
System.out.println("請輸入充值話費金額:");
money = key.nextDouble();
System.out.println("請輸入密碼:");
passwd = key.next();
abc.recharge(money, passwd);
break;
case 0:
flag2 = false;
break;
default:
System.out.println("指令無效,請重新輸入\n");
}
}
break;
}
}
key.close();
}
/** 在線支付 */
abstract void onlinePay(double money, String passwd);
/** 話費充值 */
protected abstract void recharge(double money, String string);
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
/** 密碼認證方法 */
@Override
public boolean auth(String passwd) {
if (this.passwd.equals(passwd)) {
return true;
}
return false;
}
/** 取錢方法 */
@Override
public void drawMoney(double money, String passwd) {
double balance = getBalance();
if (!auth(passwd)) {
System.out.println("銀行卡密碼輸入錯誤,取款失敗\n");
return;
}
if (balance - money <= 0) {
System.out.println("銀行卡餘額不足,取款失敗\n");
return;
}
setBalance(balance - money);
System.out.println("卡號" + getId() + "取款" + money + "元成功,剩餘餘額" + getBalance() + "\n");
}
/** 查詢餘額方法 */
@Override
public void queryBalance() {
System.out.printf("卡號:%d\n餘額:%.2f\n\n", getId(), getBalance());
}
}
5、定義工商銀行類,繼承銀行類,實現工商銀行接口
ICBCBank.java
package com.feonix;
/**
* 工商銀行類 繼承 銀行類 實現 工商銀行接口
*
* @author FeoniX
*
*/
public class ICBCBank extends Bank implements ICBC {
public ICBCBank(int id, String passwd, double balance) {
super(id, passwd, balance);
}
@Override
public void onlinePay(double money, String passwd) {
if (!auth(passwd)) {
System.out.println("銀行卡密碼輸入錯誤,在線支付失敗\n");
return;
}
if (getBalance() - money <= 0) {
System.out.println("銀行卡餘額不足,在線支付失敗\n");
return;
}
setBalance(getBalance() - money);
System.out.println("卡號" + getId() + "進行了網上支付,支付金額爲:" + money + "\n");
}
@Override
protected void recharge(double money, String string) {
}
}
6、定義農業銀行類,繼承銀行類,實現農業銀行接口
ABCBank.java
package com.feonix;
/**
* 農業銀行類 繼承 銀行類 實現 農業銀行接口
*
* @author FeoniX
*
*/
public class ABCBank extends Bank implements ABC {
private double overdraft = OVERDRAFT;
public ABCBank(int id, String passwd, double balance) {
super(id, passwd, balance);
}
@Override
public void recharge(double money, String passwd) {
if (!auth(passwd)) {
System.out.println("銀行卡密碼輸入錯誤,話費充值失敗\n");
return;
}
if (getBalance() + overdraft - money <= 0) {
System.out.println("銀行卡餘額不足,話費充值失敗\n");
return;
}
calcBanlance(money);
System.out.println("卡號" + getId() + "進行了話費充值,充值金額爲:" + money + "\n");
}
@Override
public void drawMoney(double money, String passwd) {
double balance = getBalance();
if (!auth(passwd)) {
System.out.println("銀行卡密碼輸入錯誤,取款失敗\n");
return;
}
if (balance + overdraft - money <= 0) {
System.out.println("銀行卡餘額不足,取款失敗\n");
return;
}
calcBanlance(money);
System.out.println("卡號" + getId() + "取款" + money + "元成功,剩餘餘額" + getBalance() + ",可透支餘額:" + overdraft + "\n");
}
@Override
public void queryBalance() {
System.out.printf("卡號:%d\n餘額:%.2f\n可透支額度:%.2f\n\n", getId(), getBalance(), overdraft);
}
@Override
protected void onlinePay(double money, String passwd) {
}
/**
* 扣款後計算並更新餘額
*
* @param money
*/
private void calcBanlance(double money) {
if (money > getBalance()) {
money = money - getBalance();
setBalance(0);
overdraft -= money;
} else {
setBalance(getBalance() - money);
}
}
public double getOverdraft() {
return overdraft;
}
public void setOverdraft(double overdraft) {
this.overdraft = overdraft;
}
}