桥接模式介绍与使用

目录

一、桥接模式的概念

二、代码示例


一、桥接模式的概念

桥接模式的主要作用是通过将抽象部分与实现部分分离,将多种可以相互匹配的使用进行组合,

其核心实现是在A类中含有B类接口通过构造函数传递B类的实现,这个B类就是设计的桥。

桥接模式将继承的关系转化为关联的关系,这样做的优点就是降低了类与类之间的耦合度,减少系统中类的数量,也减少了代码量。

以上的概念听起来比较的晦涩难懂,但是呢其本质也不复杂,重点就是红色字体的部分。

桥接模式主要有以下几个角色:

1.抽象类:某个业务抽取的公共抽象方法;

2.扩充抽象类:继承抽象类的方法扩展;

3.实现类接口:角色抽象类中包含的接口;

4.实现类:接口的具体实现;

二、代码示例

首先我们来看下图所描述的业务场景:

有两种支付方式:支付宝和微信支付,我们需要通过支付宝或微信进行支付操作,但是在支付的时候,又有3种支付模式去进行安全校验,只有校验通过了才能进行支付转账等操作;

如果只是简单的使用面向过程开发的思路,通过if-else的形式去实现,简单而又快速,但是这样编写的代码后期可维护性和扩展性将变的很差,为什么这么说呢,比如密码支付校验逻辑变动,支付和微信里对于的代码我们都要去修改一遍才行。

那么,如果我们通过桥接模式去实现的话会是什么样的一种情况呢?

看看下图,然后通过代码来领会一下:

 代码实现如下:

1.抽象类

package com.demo.spring.design.bridging_model;


import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 支付渠道抽象类:比如支付宝支付、微信支付;
 * @Author: yangshilei
 */
@Slf4j
public abstract class Pay {

    protected IPayModel iPayModel;

    public Pay(IPayModel iPayModel) {
        this.iPayModel = iPayModel;
    }

    /**
     * 支付渠道的划账接口:支付宝、微信等具体的支付方法
     * @param uId
     * @param tradeId
     * @param amount
     * @return
     */
    public abstract String transfer(String uId, String tradeId, BigDecimal amount);

}

2.抽象扩展类:

package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 微信支付 
 * @Author: yangshilei
 */
@Slf4j
public class WxPay extends Pay {

    public WxPay(IPayModel iPayModel){
        super(iPayModel);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {
        log.info("选择微信渠道进行支付!uId={},tradeId={},amount={}",uId,tradeId,amount);

        boolean security = iPayModel.security(uId);

        if(!security){
            log.info("校验不通过,划账失败!");
            return "500";// 响应失败结果
        }
        log.info("校验通过,可以划账!");

        return "200";// 响应成功结果
    }

}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 支付宝支付
 * @Author: yangshilei
 */
@Slf4j
public class ZfbPay extends Pay {


    public ZfbPay(IPayModel iPayModel) {
        super(iPayModel);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {
        log.info("选择支付宝渠道进行支付!uId={},tradeId={},amount={}", uId, tradeId, amount);

        boolean security = iPayModel.security(uId);

        if (!security) {
            log.info("校验不通过,划账失败!");
            return "500";// 响应失败结果
        }
        log.info("校验通过,可以划账!");

        return "200";// 响应成功结果
    }
}

3.接口类:

package com.demo.spring.design.bridging_model;

/**
 * @Description: 支付模式,比如刷脸支付、指纹支付、密码支付等等
 * @Author: yangshilei
 */
public interface IPayModel {

    /**
     * 支付前的安全校验,只有安全校验通过后才能去付款;
     * @param id
     * @return
     */
    boolean security(String id);

}

4.接口实现类:

package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 密码支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayCypher implements IPayModel {

    @Override
    public boolean security(String id) {
        log.info("密码支付,风控校验指纹识别!");
        return true;
    }

}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 指纹支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayFingerMode implements IPayModel{

    @Override
    public boolean security(String id) {
        log.info("指纹支付,风控校验指纹识别!");
        return true;
    }
}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 刷脸支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayFaceMode implements IPayModel {

    @Override
    public boolean security(String id) {
        log.info("人脸支付,风控校验指纹识别!");
        return true;
    }

}

最后就是测试类:

package com.demo.spring.design.bridging_model;

import java.math.BigDecimal;
import java.util.UUID;

public class BridgeTest {
   public static void main(String[] args) {
       Pay wxPay = new WxPay(new PayCypher());
       wxPay.transfer("0001",UUID.randomUUID().toString(),new BigDecimal(100));

       System.out.println("--------------------------------------------");

       Pay zfbPay = new ZfbPay(new PayFaceMode());
       zfbPay.transfer("002", UUID.randomUUID().toString(),new BigDecimal(50));
   }
}

执行的结果如下:

20:54:31.703 [main] INFO com.demo.spring.design.bridging_model.WxPay - 选择微信渠道进行支付!uId=0001,tradeId=b530bcbb-5dc6-497d-84e6-6155323b8b51,amount=100
20:54:31.706 [main] INFO com.demo.spring.design.bridging_model.PayCypher - 密码支付,风控校验指纹识别!
20:54:31.707 [main] INFO com.demo.spring.design.bridging_model.WxPay - 校验通过,可以划账!
--------------------------------------------
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.ZfbPay - 选择支付宝渠道进行支付!uId=002,tradeId=1498b697-f83e-4f31-88a2-01b5ea5e94c6,amount=50
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.PayFaceMode - 人脸支付,风控校验指纹识别!
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.ZfbPay - 校验通过,可以划账!

Process finished with exit code 0

好了,今天关于桥接模式的介绍就到此结束了,有不足的地方欢迎提出指正!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值