题目详情
利用面向对象的思想实现一套代码,要求一个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);
}
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);
}
}