Java入门第66课——银行卡系统(实现银联接口)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/houjunkang363/article/details/90726659

问题

        本案例要求实现银行卡系统的银联接口,详细要求如下:

        1.银联接口,用于描述银联统一制定的规则,该接口提供检测密码方法、取钱方法以及查询余额方法。

        2.工商银行接口,用于描述工商银行发行的卡片功能,在满足银联接口的规则基础上,增加了在线支付功能。

        3.农业银行接口,用于描述中国农业银行发行的卡片功能,在满足银联接口的规则基础上,增加了支付电话费的功能。另外,农行的卡的卡内余额,允许最多透支2000。

        4.实现工商银行接口和农业银行接口,并进行测试。

        工行卡的控制台交互效果如图-1所示:

图111.jpg

        农行卡的控制台交互效果如下-2所示:

图111.jpg

        从图-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<money){
                 money-=number;
             }
         }
         
         @Override
         public boolean checkPwd(String input){
             if(pwd.equals(input)){
                 return true;
             }else{
                 return false;
             }
         }
     }

        以上四个方法的实现逻辑为:

        取钱功能的实现为在当前余额的基础上减去要取的金额,如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元的。

扫描关注我吧:

猜你喜欢

转载自blog.csdn.net/houjunkang363/article/details/90726659