您当前的位置: 首页 > 

java持续实践

暂无认证

  • 3浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式 桥接模式

java持续实践 发布时间:2022-03-20 18:06:48 ,浏览量:3

文章目录
      • 桥接模式
      • 桥接模式实战
        • 不使用桥接模式的写法
        • 使用桥接模式的写法

桥接模式

通过将抽象部分与实现部分分离 ,把多钟可匹配的场景进行组合. 核心实现是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.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0738s