[阶段一]java编程比赛-支付问题

来源:互联网 发布:广州白云心理医院 知乎 编辑:程序博客网 时间:2024/05/16 17:15

题目详情

利用面向对象的思想实现一套代码,要求一个APP支持微信支付,支付宝支付,银联支付,以后甚至更多的支付方式。支付通常包含鉴权(authorization)、支付订单生成(generateBill)、最后确认支付(pay)过程。

题目分析

该题考查的是面向对象的编程思想,主要是面向接口的编程,程序设计的时候得考虑到未来可能的多种支付方式。支付是一种通用的协议/规范,具体每种支付都有自己的实现,大致思路是一样的。这里仅仅考虑三个过程:鉴权、生成订单、确认支付。当然现实生活中这个模型肯定是远远不够的,这里仅仅为了考察实现思路。

类设计

其中包含6个类,如下图所示:
类结构图
- AliPay.java 实现支付宝支付的类
- BankPay.java 实现银联支付的类
- WechatPay.java 实现微信支付的类
- IPay.java 支付抽象接口,里面实现了三个抽象方法
- PayFactory.java 生成支付对象的工厂
- PayTest.java 用于测试的类

类实现

IPay.java

package com.mashen.pay;/* * 简易支付接口设计 * @author tony * @date 2016/7/31 */public interface IPay {    /*     * 用户鉴权     * @param {String}用户名     * @param {String}令牌     * @return {boolean}鉴权是否通过,返回true or false     */    boolean authorization(String userName,String accessToken);    /*     * 生成订单Id     * @param {double} 支付的金额     * @return {String} 返回订单Id     */    String generateBill(double payAmount);    /*     * 确认支付     * @param {String} 订单Id     * @param {String} 支付密码     * @return {String} 支付是否成功     */    boolean confirmPay(String billId,String password);}

具体的某个支付类的实现大同小异,这里以AliPay.java为力,里面的鉴权,要求用户给过来的用户名是tony,确认支付的时候输入的是123123。

package com.mashen.pay;import java.util.UUID;/* * 用于支持支付宝支付的类 */public class AliPay implements IPay {    @Override    public boolean authorization(String userName, String accessToken) {        return userName.equals("tony");    }    @Override    public String generateBill(double payAmount) {        return UUID.randomUUID().toString();    }    @Override    public boolean confirmPay(String billId, String password) {        return password.equals("123123");    }}

PayFactory.java 用于生产支付类

package com.mashen.pay;public class PayFactory {    //根据传入的类型来匹配支付方式,想象下在app里面点击银联图标,微信图标,支付宝图标    public static IPay getPayObj(int type){        IPay pay=null;        switch (type) {        case 1:            pay=new BankPay();            break;        case 2:            pay=new WechatPay();            break;        case 3:            pay=new AliPay();            break;        }        return pay;    }}

最后就是PayTest.java类了,里面包含了比较丰富的逻辑,具体可以运行起来查看逻辑。

package com.mashen.pay;import java.util.InputMismatchException;import java.util.Scanner;import java.util.UUID;public class PayTest {    public static void main(String[] args) {        System.out.println("欢迎使用App自助支付系统!请选择支付方式:");        System.out.println("1.银联支付");        System.out.println("2.微信支付");        System.out.println("3.支付宝支付");        System.out.println("0.取消支付");        Scanner scanner=new Scanner(System.in);        String user="tony";        String password="123456";        int payType=0;        double payAmount=0;        //执行支付        do{             System.out.print("请选择支付方式:");             try{                 payType = scanner.nextInt();                 if(payType>0&&payType<=3){                     System.out.print("请输入支付金额:");                     payAmount=scanner.nextDouble();                     if(payAmount>0){                         //获取订单生成的结果                         String billId= pay(user,payType, payAmount);                         //订单校验                         if(billId.length()>0){                             System.out.print("是否立刻支付(Y/N):");                             String isPayNow=scanner.next();                             if(isPayNow.equalsIgnoreCase("Y")){                                 System.out.print("输入支付密码:");                                 password=scanner.next();                                 boolean result=confirmPay(payType,billId, password);                                 if(result){                                    System.out.println("支付成功!欢迎下次光临!");                                    payType=0;                                 }                             }else{                                 System.err.println("输入不正确,取消支付");                                 payType=0;                               }                         }else{                             System.err.println("订单生成不正确,取消支付");                             payType=0;                          }                     }else{                         System.err.println("订单金额不正确,取消支付");                         payType=0;                      }                 }else{                     System.err.println("支付类型不正确,取消支付");                     payType=0;                 }             }catch(InputMismatchException e){                 System.err.println("输入信息错误,取消支付");                 payType=0;             }        }while(!(payType==0));        System.out.println("支付结束!");        scanner.close();    }    //开始支付    private static String pay(String user,int payType,double payAmount) {        String type="";        switch (payType) {        case 1:            type="银联支付";            break;        case 2:            type="微信支付";            break;        case 3:            type="支付宝支付";            break;        }        System.out.println("您正在使用"+type+"支付金额是:"+payAmount+",请稍后......");        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        //生成支付对象        IPay payObj=PayFactory.getPayObj(payType);        //进行鉴权        boolean isValid=payObj.authorization(user, UUID.randomUUID().toString());        if(isValid){            String billId=payObj.generateBill(payAmount);            System.out.println("支付订单已经生成:"+billId.replace("-",""));            return billId;        }else{            System.err.println("鉴权失败");            return "";        }    }    //确认支付    private static boolean confirmPay(int payType,String billId,String password){        //生成支付对象        IPay payObj=PayFactory.getPayObj(payType);        return payObj.confirmPay(billId, password);    }}

以上就是关于这道题目的实现思路,当然还可以考虑的更加仔细些,例如『支付超时的情况』等。代码实现效果如下:
输出展示

代码下载

题目一_支付类设计.zip

运行过程中如遇到任何问题,请各位跟帖指正!

2 0