设计模式--桥接模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

我们可能看了很多讲设计模式的书籍,看后既忘无法将它用到实际的业务场景中去,这个系列的文章将结合具体场景分析各种模式的使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、桥接模式的使用场景?

示例:结合实际经验来说,我们常见的一种场景(支付场景)目前支付三方平台将支付宝、微信等集中起来提供给商家,同时支持人脸指纹密码等多种支付方式。抽象来看就是多支付平台与多支付方式的一种组合使用。

二、具体思路

1.新手实现

代码如下(示例):

// 使用微信支付
if(1==payType) {
if(1==payMode)
}else if(2==payMode){
}else if(3==payMode){
}
// 支付宝支付
if(2==payType) {
if(1==payMode)
}else if(2==payMode){
}else if(3==payMode){
}

类似上面典型的if……else这样的代码。分析不难发现实将支付平台和支付模式耦合在了一起,那么我们的目标就是解耦并通过组合的方式将多种平台和多种支付模式组合起来使用。

2.桥接模式

我们把支付类型和支付模式分类,通过抽象类依赖实现类的方式将桥接:
设计模式--桥接模式】

类实现和代码如下:

// 支付方式接口
public interface IPayMode {

    boolean security(String uId);

}

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(PayCypher.class);

    public boolean security(String uId) {
        logger.info("人脸支付,风控校验脸部识别");
        return true;
    }

}

public class PayFingerprintMode implements IPayMode{

    protected Logger logger = LoggerFactory.getLogger(PayCypher.class);

    public boolean security(String uId) {
        logger.info("指纹支付,风控校验指纹信息");
        return true;
    }

}

抽象类中定义支付类型
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 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";
    }

}

总结

:以上就是桥接模式的核心思想。将耦合的两部分拆出来,将接口与抽象通过组合的形式桥接到一起。这样通过接口具体实现类选择性使用不同的类方法。

上一篇:Tree/树的统计


下一篇:23Django云笔记项目6(编写登录状态装饰器并完成文章发布)