本案例要求实现银行卡系统的银联接口,详细要求如下:
1.银联接口,用于描述银联统一制定的规则,该接口提供检测密码方法、取钱方法以及查询余额方法。
2.工商银行接口,用于描述工商银行发行的卡片功能,在满足银联接口的规则基础上,增加了在线支付功能。
3.农业银行接口,用于描述中国农业银行发行的卡片功能,在满足银联接口的规则基础上,增加了支付电话费的功能。另外,农行的卡的卡内余额,允许最多透支2000。
4.实现工商银行接口和农业银行接口,并进行测试。
工行卡的控制台交互效果如图-1所示:
农行卡的控制台交互效果如下-2所示:
从图-2中可以看出,农行卡的卡内余额可以为负数。
实现此案例需要按照如下步骤进行。
首先,定义名为UnionPay的银联接口,用于描述银联统一制定的规则;然后,在该接口中定义getBalance方法表示获取余额功能、定义drawMoney表示取钱功能、定义checkPwd表示检查密码功能,代码如下所示:
/**
*接口:用于描述银联统一制定的规则
*/
public interface UnionPay{
/**查看余额*/
public doublea getBalance();
/**取钱*/
public boolean drawMoney(double number);
/**检查密码*/
public boolean checkPwd(String input);
}
定义名为ICBC的接口表示工商银行接口,用于描述中国工商银行发行的卡片功能,该接口需要满足银联接口的功能,因此,继承银联接口;该接口在具备银联接口的功能基础上,要求增加在线支付功能,所以,在该接口中定义payOnline方法,表示此功能,代码如下所示:
/**
*接口:用于描述工商银行发行的卡片功能,在满足
*银联的规则基础上,添加自己特有的功能
*/
public interface ICBC extends UnionPay{
/**增加的在线支付功能*/
public void payOnline(double number);
}
定义名为ABC的接口表示农业银行接口,用于描述中国农业银行发行的卡片功能,该接口需要满足银联接口的功能,因此,需要继承银联接口;该接口在具备银联接口的功能基础上,要求增加在线支付功能,所以,在该接口中定义payTelBill方法,表示此功能,代码如下所示:
/**
*接口:用于描述中国农业银行发行的卡片功能,在满足银联的规则基础上,添加
*添加自己特有的功能
*/
public interface ABC extends UnionPay{
/**增加支付电话费的功能*/
public void payTelBill(String phoneNum,double num);
}
首先,定义为名ICBCImpl的类,该类实现ICBC接口;另外,分析问题中的取钱功能,需要对余额信息进行存储,插入卡片以后需要输入密码后才能进行取钱,因此,在ICBCImpl类中定义double类型属性money表示账户余额以及String类型属性pwd表示卡片的密码,代码如下所示:
/**
*类:用于描述工商银行实际发行的卡片
*该卡片具有的功能来自于继承的已经符合银联规范的ICBC接口
*/
public class ICBCImpl implements ICBC{
private double money;
private String pwd;
public ICBCImpl(double money,String pwd){
this.money=money;
this.pwd=pwd;
}
}
在ICBCImpl类实现checkPwd方法、getBalance方法、drawMoney方法以及payOnline方法,代码如下所示:
/**
*类:用于描述工商银行实际发行的卡片
*该卡片具有的功能来自于继承的已经符合银联规范的ICBC接口
*/
public class ICBCImpl implements ICBC{
private double money;
private String pwd;
public ICBCImpl(double money,String pwd){
this.money=money;
this.pwd=pwd;
}
@Override
public double getBalance(){
return money;
}
@Override
public boolean drawMoney(double number){
if(number<=money){
money-=number;
return true;
}
return false;
}
@Override
public void payOnline(double number){
if(number
以上四个方法的实现逻辑为:
取钱功能的实现为在当前余额的基础上减去要取的金额,如drawMoney方法的实现。
在线付款功能的实现为当前余额的基础上减去要支付的金额,如payOnline方法的实现。
检查密码功能的实现检查卡的密码与用户输入的密码是否相等,如果相等返回true,否则返回false,如checkPwd方法的实现。
获取余额功能的实现为类ICBCImpl,类中money属性即表示余额,将其返回即可,如getBalance方法的实现。
实现农业银行接口的过程与实现工行接口的过程类似,实现的过程中注意,农行卡的卡内余额可以透支2000,代码如下所示:
/**
*类:用于描述农业银行实际发行的卡片
*该卡片具有的功能来自于继承的已经符合银联规范的ABC接口
*/
public class ABCImpl implements ABC{
/**卡内余额,允许最多透支2000*/
private double balance;
/**账号密码*/
private String password;
public ABCImpl(double balance,String password){
this.balance=balance;
this.password=password;
}
@Override
public double getBalance(){
return balance;
}
@Override
public boolean drawMoney(double number){
if((balance-number)>=-2000){
balance-=number;
return true;
}
return false;
}
@Override
public boolean checkPwd(String input){
if(password.equals(input)){
return true;
}else{
return false;
}
}
@Override
public boolean payTelBill(String phoneNum,double sum){
if(phoneNum.length()==11&&(balance-sum)>=-2000){
balance-=sum;
return true;
}
return false;
}
}
新建TestUnionPay类,测试银联接口提供的方法,是否成功实现,代码如下所示:
import java.util.Scanner;
/**
*测试实现接口后的类的方法调用
*/
public class TestUnionPay{
public static void main(String[] args){
UnionPay icbc=new ICBCImpl(2000,"123456");
Scanner input=new Scanner(System.in);
System.out.println("请输入密码:");
if(icbc.checkPwd(input.next())){
System.out.println("请输入金额:");
double sum=Double.parseDouble(input.next());
if(icbc.drawMoney(num)){
System.out.println("取钱成功,卡余额为:"+icbc.getBalance());
}else{
System.out.println("取钱失败");
}
}else{
System.out.println("密码错误");
}
input.close();
}
}
查看上述代码,可以看出以上代码是采用ICBCImpl类来实例化银联接口UnionPay的,当然,也可以使用ABCImpl来实例化银联接口UnionPay,此时,卡内余额是可以透支2000元的。