目录

介绍

‍♂️ 实现

‍ 抽象类:

支付宝

微信

‍ 支付方法接口:

支付宝-APP支付

微信-APP支付

微信-H5支付


开始前给大家推荐一款很火的刷题、面试求职网站

‍ 抽象类:

import com.alibaba.fastjson.JSONObject;public abstract class Pay {   /**    * 具体支付方式:APP、H5、Native...    */   protected IPayMode payMode;   /**    * 支付方式:支付宝、微信...    *    * @param payMode    */   public Pay(IPayMode payMode) {      this.payMode = payMode;   }   /**    * 支付接口,创建预支付订单    *    * @return    */   public abstract Object transfer(JSONObject param);}

继承抽象类实现 各种支付方式:

支付宝

public class Alipay extends Pay {   public Alipay(IPayMode payMode) {      super(payMode);   }   public Object transfer(JSONObject param) {      System.out.println("开始模拟支付宝支付...");      Object res = payMode.payMode(param);      return res;   }}

微信

public class WeChat extends Pay {   public WeChat(IPayMode payMode) {      super(payMode);   }   public Object transfer(JSONObject param) {      System.out.println("开始模拟微信支付...");      Object res = payMode.payMode(param);      return res;   }}

‍ 支付方法接口:

public interface IPayMode {   /**    * 具体支付的方法    *    * @param param    * @return    */   Object payMode(JSONObject param);}

支付宝-APP支付

public class AlipayApp implements IPayMode {   @Override   public Object payMode(JSONObject param) {      System.out.println("支付方式:APP支付");      return "支付宝支付—APP预支付订单创建成功";   }}

微信-APP支付

public class WeChatApp implements IPayMode {   @Override   public Object payMode(JSONObject param) {      System.out.println("支付方式:APP支付");      return "微信支付—APP预支付订单创建成功";   }}

微信-H5支付

public class WeChatH5 implements IPayMode {   @Override   public Object payMode(JSONObject param) {      System.out.println("支付方式:H5支付");      return "微信支付—H5预支付订单创建成功";   }}

测试1:

void uploading() {   System.out.println("\r\n模拟测试场景:微信支付");   Pay wxPay = new WeChat(new WeChatH5());   JSONObject param = new JSONObject();   Object pay = wxPay.transfer(param);   System.out.println( pay);   System.out.println("\r\n模拟测试场景:支付宝支付");   Pay zfbPay = new Alipay(new AlipayApp());   Object transfer = zfbPay.transfer(param);   System.out.println(transfer);}

到这里可以发现想要什么支付,并且想要什么样的支付方式,直接new即可,但是由于前端交互的参数过来还是要if…else判断是微信支付还是支付宝支付,然后在嵌套if…else判断是APP、Native、H5…支付方式,多写一句if…else不就是要我的命吗?

所有用一个简单的工厂来做这个事情。

public class SimpleFactory {   // 支付宝APP支付   public static final int ALI_PAY_APP = 1;   // 微信APP支付   public static final int WE_CHAT_APP = 2;   // 微信H5支付   public static final int WE_CHAT_H5 = 3;   public static Pay factoryMake(int type) {      switch (type) {         case ALI_PAY_APP:            return new Alipay(new AlipayApp());         case WE_CHAT_APP:            return new WeChat(new WeChatApp());         case WE_CHAT_H5:            return new WeChat(new WeChatH5());      }      return null;   }}

测试2:

Pay pay = SimpleFactory.factoryMake(2);Object transfer = pay.transfer(new JSONObject());System.out.println("transfer = " + transfer);

总结:

从结果中可以得出根据不同的type,就可以取不同的支付方式了,虽然类变多了,但是维护方便了,比起if/else/switch 相比调用方式更加简洁、干净、易使用,且满足单一职责和开闭原则,让每一部分内容都很清晰易于维护和拓展,外部使用接口的用户不需要关心具体的实现,只要传入对应的参数即可。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。