目录
一、桥接模式的概念
二、代码示例
一、桥接模式的概念
桥接模式的主要作用是通过将抽象部分与实现部分分离,将多种可以相互匹配的使用进行组合,
其核心实现是在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
好了,今天关于桥接模式的介绍就到此结束了,有不足的地方欢迎提出指正!
|