[阶段一]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
- [阶段一]java编程比赛-支付问题
- [阶段一]java编程比赛-龟兔赛跑
- [阶段一]java基础编程比赛
- [阶段一]java编程比赛—adb命令执行
- JAVA之编程比赛
- NowcoderGirl编程比赛(一)
- [JAVA]比赛评分问题
- [阶段一]Java多线程
- 比赛分组问题(一)
- 小码哥杯java程序比赛复习(五)阶段综合练习
- 腾讯编程比赛的试题(一)
- [阶段一]Java基础语法-数据类型(1)
- [阶段一]Java基础语法-数据类型(2)
- [阶段一]Java基础语法-数据类型(3)
- HttpWebRequest编程相关问题阶段总结
- java版+支付宝支付和微信支付(一)
- Java服务端支付功能模块--(一)支付宝支付
- Java基础编程题(API阶段测试)
- PowerDesigner 中 dependency与 link/ExtendedDependency的区别
- Stack和Queue:后进先出和先进先出和Java 实现后进先出(LIFO)及Stac和Java集合类: Set、List、Map、Queue使用场景梳理 - .Little Hann
- dojo中lang.hitch()的简单用法
- android jni c语言回调java
- memcpy函数语法 用法 例子
- [阶段一]java编程比赛-支付问题
- 重构定义
- 欢迎使用CSDN-markdown编辑器
- 数据结构实验之链表九:双向链表
- #2006 - MySQL server has gone away 问题解决方法
- mysql事务隔离级别、乐观锁、悲观锁
- java list转JSONObject报错
- easyui datagrid宽度设置在ie8无效的问题
- jquery easyui window href加载页面,子页面JS失效问题