文章目录
桥接模式
- 桥接模式
- 桥接模式实战
- 不使用桥接模式的写法
- 使用桥接模式的写法
通过将抽象部分与实现部分分离 ,把多钟可匹配的场景进行组合. 核心实现是A类中有B类的接口, 通过构造函数传递B类的实现, 这个B类就是桥.
JDBC的多种驱动的实现, 业务实现中的多种类接口的同组过滤服务.
桥接模式实战支付有支付宝和微信, 支付宝微信支付时也有密码验证 ,指纹, 人脸识别. 那么他们相互组合, 一共有6种方式来进行支付.
不使用桥接模式的写法创建tutorials-10.0-0模块. 建立PayController. 把上述六种支付方式进行if else 组合.
public class PayController {
private Logger logger = LoggerFactory.getLogger(PayController.class);
public boolean doPay(String uId, String tradeId, BigDecimal amount, int channelType, int modeType) {
// 微信支付
if (1 == channelType) {
logger.info("模拟微信支付划账开始: uId:{} tradeId: {} amount: {}", uId, tradeId, amount);
if (1 == modeType) {
logger.info("密码支付 风控检验环境 安全");
} else if (2 == modeType) {
logger.info("人脸支付 风控检验脸部识别");
} else if (3 == modeType) {
logger.info("指纹支付, 风控检验指纹信息");
}
}
// 支付宝支付
else if (2 == channelType) {
logger.info("模拟支付宝支付划账开始. uId: {}, tradeId: {} amount: {}", uId, tradeId, amount);
if (1 == modeType) {
logger.info("密码支付 风控检验环境 安全");
} else if (2 == modeType) {
logger.info("人脸支付 风控检验脸部识别");
} else if (3 == modeType) {
logger.info("指纹支付, 风控检验指纹信息");
}
}
return true;
}
}
测试类如下
public class ApiTest {
@Test
public void test_pay() {
PayController pay = new PayController();
System.out.println("模拟微信支付 人脸验证");
pay.doPay("weixin_110000", "100000", new BigDecimal(100), 1, 2 );
System.out.println("模拟支付宝支付 指纹验证");
pay.doPay("zfb_110000", "200000", new BigDecimal(50), 2, 3 );
}
}
控制台打印如下
模拟微信支付 人脸验证
17:56:34.415 [main] INFO com.thc.design.PayController - 模拟微信支付划账开始: uId:weixin_110000 tradeId: 100000 amount: 100
17:56:34.415 [main] INFO com.thc.design.PayController - 人脸支付 风控检验脸部识别
模拟支付宝支付 指纹验证
17:56:34.415 [main] INFO com.thc.design.PayController - 模拟支付宝支付划账开始. uId: zfb_110000, tradeId: 200000 amount: 50
17:56:34.415 [main] INFO com.thc.design.PayController - 指纹支付, 风控检验指纹信息
使用桥接模式的写法
支付渠道和支付验证方式, 分别进行抽象, 并且把支付验证方式的抽象类桥接到支付渠道中.
工程结构
创建IPayMode 支付方式验证接口
public interface IPayMode {
boolean security(String uId);
}
创建支付方式抽象类. 并且其构造方法中含有支付验证接口.
public abstract class Pay {
protected Logger logger = LoggerFactory.getLogger(Pay.class);
// 依赖支付验证方式
protected IPayMode payMode;
public Pay(IPayMode payMode) {
this.payMode = payMode;
}
// 支付操作
public abstract String transfer(String uId, String tradeId, BigDecimal amount);
}
创建微信的支付类
public class WxPay extends Pay {
public WxPay(IPayMode payMode) {
super(payMode);
}
public String transfer(String uId, String tradeId, BigDecimal amount) {
logger.info("模拟微信支付开始 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
boolean security = payMode.security(uId);
logger.info("模拟微信支付风控检验 uId:{} tradeId:{} security:{}", uId, tradeId, security);
if (!security) {
logger.info("模拟微信支付风控拦截 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "0001";
}
logger.info("模拟微信支付转账成功 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "0000";
}
}
创建支付宝支付的实现类.
public class ZfbPay extends Pay {
public ZfbPay(IPayMode payMode) {
super(payMode);
}
public String transfer(String uId, String tradeId, BigDecimal amount) {
logger.info("模拟支付宝支付开始 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
boolean security = payMode.security(uId);
logger.info("模拟支付宝支付风控检验 uId:{} tradeId:{} security:{}", uId, tradeId, security);
if (!security) {
logger.info("模拟支付宝支付风控拦截 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "0001";
}
logger.info("模拟支付宝支付转账成功 uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "0000";
}
}
上面两个类的构造方法中必须传入支付验证方式, 实现桥接. 密码验证
public class PayCypher implements IPayMode {
protected Logger logger = LoggerFactory.getLogger(PayCypher.class);
public boolean security(String uId) {
logger.info("密码支付,风控校验环境安全");
return true;
}
}
人脸识别验证
public class PayFaceMode implements IPayMode{
protected Logger logger = LoggerFactory.getLogger(PayFaceMode.class);
public boolean security(String uId) {
logger.info("人脸支付,风控校验脸部识别");
return true;
}
}
指纹识别验证
public class PayFingerprintMode implements IPayMode {
protected Logger logger = LoggerFactory.getLogger(PayFingerprintMode.class);
public boolean security(String uId) {
logger.info("指纹支付,风控校验指纹信息");
return true;
}
}
测试类如下 创建支付方式的时候, 传入验证方式 Pay wxPay = new WxPay(new PayFaceMode());
Pay zfbPay = new ZfbPay(new PayFingerprintMode());
public class ApiTest {
@Test
public void test_pay() {
System.out.println("模拟测试场景: 微信支付 人脸方式 ");
Pay wxPay = new WxPay(new PayFaceMode());
wxPay.transfer("weixin34444", "55345345345", new BigDecimal(100));
System.out.println("模拟测试场景; 支付宝支付 指纹方式");
Pay zfbPay = new ZfbPay(new PayFingerprintMode());
zfbPay.transfer("zfb324235", "234324234234", new BigDecimal(50));
}
}
控制台打印如下
模拟测试场景: 微信支付 人脸方式
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟微信支付开始 uId:weixin34444 tradeId:55345345345 amount:100
18:05:18.036 [main] INFO com.thc.pay.mode.PayFaceMode - 人脸支付,风控校验脸部识别
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟微信支付风控检验 uId:weixin34444 tradeId:55345345345 security:true
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟微信支付转账成功 uId:weixin34444 tradeId:55345345345 amount:100
模拟测试场景; 支付宝支付 指纹方式
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟支付宝支付开始 uId:zfb324235 tradeId:234324234234 amount:50
18:05:18.036 [main] INFO com.thc.pay.mode.PayFingerprintMode - 指纹支付,风控校验指纹信息
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟支付宝支付风控检验 uId:zfb324235 tradeId:234324234234 security:true
18:05:18.036 [main] INFO com.thc.pay.channel.Pay - 模拟支付宝支付转账成功 uId:zfb324235 tradeId:234324234234 amount:50
成功进行了改造, 去掉了一系列的if else.