我的Java學習之路(六)-- 銀行卡系統

一、功能描述

  1. 要求實現銀行卡系統的銀聯接口,詳細要求如下
    1. 銀聯接口,用於描述銀聯統一制定的規則,該接口提供檢查密碼,取錢以及查詢餘額方法
    2. 工商銀行接口,用於描述工行發行的卡片功能,在滿足銀聯接口的規則基礎上,增加了在線支付功能。
    3. 農業銀行接口,用於描述農行發行的卡片功能,在滿足銀聯接口的規則基礎上,增加了支付電話費的功能。另外,農行的卡可以透支5000元。
    4. 實現工行接口和農行接口,並進行測試

二、實現代碼

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;
	}

}

演示效果圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章