(支付问题)面向对象

题目详情

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

题目分析

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

类设计

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

类实现

IPay.java
package com.yong.pay; 

public interface IPay {
	/*
	 * 用户鉴权
	 * @param {String}用户名
     * @param {String}令牌
     * @return {boolean}鉴权是否通过,返回true or false
	 * */
	boolean authorization(String useName,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.yong.pay;
import java.util.UUID;
public class AliPay implements IPay{

	@Override
	public boolean authorization(String userName, String accessToken) {
		// TODO Auto-generated method stub
		return userName.equals("tony");
	}

	@Override
	public String generateBill(double payAmount) {
		// TODO Auto-generated method stub
		return UUID.randomUUID().toString();
	}

	@Override
	public boolean confirmPay(String billId, String password) {
		// TODO Auto-generated method stub
		return password.equals("123123");
	}

}
PayFactory.java 用于生产支付类
package com.yonge.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.yong.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);
    }
}























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值