(支付问题)面向对象
来源:互联网 发布:access数据库安装包 编辑:程序博客网 时间:2024/05/29 08:16
题目详情
利用面向对象的思想实现一套代码,要求一个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{@Overridepublic boolean authorization(String userName, String accessToken) {// TODO Auto-generated method stubreturn userName.equals("tony");}@Overridepublic String generateBill(double payAmount) {// TODO Auto-generated method stubreturn UUID.randomUUID().toString();}@Overridepublic boolean confirmPay(String billId, String password) {// TODO Auto-generated method stubreturn 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 0
- (支付问题)面向对象
- 闰年问题(C++面向对象初步)
- 面向对象来看问题
- 面向对象问题复习
- 面向对象小问题
- 面向对象的问题
- python面向对象问题
- 面向对象相关问题
- 从面向结构到面向对象-----josephus问题(方法四:面向对象的实现)
- 面向问题,而非面向对象
- 面向问题,而非面向对象
- 黑马程序员-Java面向对象III(面向对象相关问题及案例分析)
- 面向对象谁更纯的问题
- java面向对象问题小记
- 面向对象:Close的问题
- Java面向对象问题集锦
- Java面向对象问题汇总
- 面向对象的基础问题
- 修改ProgressBar的进度条颜色
- 嵌入式Linux学习笔记
- 平衡二叉树(AVL)(一)
- Android逆向分析案例——某点评APP登陆请求数据解密
- Codeforces Round #109 (Div. 1) C. Double Profiles
- (支付问题)面向对象
- Qt实现自定义按钮的三态效果
- RxJava漫谈-RxAndroid使用
- Chrome中的小彩蛋
- C#中Socket用法,多个聊天和单一聊天。
- 结构体struct 名称定义详解
- switch----java
- 蓝队网络虚拟主机如何设置301重定向
- Android 调去照相程序拍照