介绍
定义:将抽象部分与实现部分分离,使他们都可以独立的变化
桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效的控制了系统中类的个数。
结构图
代码示例
模拟不同的支付工具对应不同的支付模式,比如微信和支付宝支付,都可以完成支付操作,而支付操作又可以分为扫码支付、密码支付和人脸支付等,那么关于支付操作其实有两个维度:支付渠道和支付方式。
未使用桥接模式前代码
public class PayController {
/**
*
* @param uId 用户id
* @param tradeId 交易流水号
* @param amount 交易金额
* @param channelType 渠道类型 1微信2支付宝
* @param modeType 支付模式 1密码 2人脸 3指纹
* @return
*/
public boolean doPay(String uId, String tradeId, BigDecimal amount,int channelType,int modeType){
//微信支付
if (1 == channelType){
System.out.println("微信渠道支付划账开始。。。。");
if (1 == modeType){
System.out.println("密码支付");
} else if (2 == modeType){
System.out.println("人脸支付");
}else if (3 == modeType){
System.out.println("指纹支付");
}
}
//支付宝支付
if (2 == channelType){
System.out.println("支付宝渠道支付划账开始。。。。");
if (1 == modeType){
System.out.println("密码支付");
} else if (2 == modeType){
System.out.println("人脸支付");
}else if (3 == modeType){
System.out.println("指纹支付");
}
}
return true;
}
}
桥接模式重构
桥接模式说到底用的还是组合的方式将非核心的功能提取出来,以组合的方式将其传输进去而已。
/**
* 支付模式接口
* @author zhuoyue
*/
public interface IPayMode {
/**
* 安全校验功能:对各种支付模式进行风控校验操作
* @param uId 用户id
* @return
*/
boolean security(String uId);
}
public class PayFaceMode implements IPayMode {
@Override
public boolean security(String uId) {
System.out.println("人脸支付,风控校验--》脸部识别");
return true;
}
}
public class PayFingerprintMode implements IPayMode {
@Override
public boolean security(String uId) {
System.out.println("指纹支付,风控校验--》指纹识别");
return true;
}
}
public class PayCypherMode implements IPayMode {
@Override
public boolean security(String uId) {
System.out.println("密码支付,风控校验--》环境安全");
return true;
}
}
public abstract class Pay {
/**
* 桥接对象
*/
protected IPayMode payMode;
public Pay(IPayMode payMode) {
this.payMode = payMode;
}
/**
* 划账
* @param uId 用户id
* @param tradeId 交易流水号
* @param amount 交易金额
* @return
*/
public abstract String transfer(String uId, String tradeId, BigDecimal amount);
}
public class WxPay extends Pay{
public WxPay(IPayMode payMode) {
super(payMode);
}
@Override
public String transfer(String uId, String tradeId, BigDecimal amount) {
System.out.println("微信渠道支付划账开始......");
boolean security = payMode.security(uId);
System.out.println("微信渠道支付风险校验:"+uId+","+tradeId+","+security);
if (!security){
System.out.println("微信渠道支付划账失败!");
return "500";
}
System.out.println("微信渠道划账成功!金额:"+amount);
return "200";
}
}
public class ZfbPay extends Pay{
public ZfbPay(IPayMode payMode) {
super(payMode);
}
@Override
public String transfer(String uId, String tradeId, BigDecimal amount) {
System.out.println("支付宝渠道支付划账开始......");
boolean security = payMode.security(uId);
System.out.println("支付宝渠道支付风险校验:"+uId+","+tradeId+","+security);
if (!security){
System.out.println("支付宝渠道支付划账失败!");
return "500";
}
System.out.println("支付宝渠道划账成功!金额:"+amount);
return "200";
}
}
测试
@Test
public void test02(){
System.out.println("测试场景1:微信支付、人脸支付");
Pay wxpay = new WxPay(new PayFaceMode());
wxpay.transfer("wx_0001001","100090009",new BigDecimal(100));
System.out.println("测试场景2:支付宝支付、指纹支付");
ZfbPay zfbPay = new ZfbPay(new PayFingerprintMode());
zfbPay.transfer("wx_0001001","100090009",new BigDecimal(100));
}