设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)

这是一个不常用的设计模式,了解核心思想即可

  1. 什么是桥接模式
  2. 应用场景
  3. 场景举例
  4. Java实现

什么是桥接模式

1、将抽象部分与实体部分分离

2、处理多个独立变化的维度,在抽象层建立关联,其中抽象类作为桥

3、通过构造函数的方式将接口传入实现联系

应用场景

JDBC多种驱动的实现

img

场景举例

目前有支付方式wx支付与zfb支付,有解锁方式人脸识别与指纹解锁

现需要两种方式结合的方式才能完成付款功能,如何进行实现?

如果采用传统的方式,可得到类图

img

此时如果加一个云闪付,那么需要增加3个类,增加一个密码解锁需要增加2个类

这个只是最简单的举例,实际业务远比这复杂得多,可以想象到,如果进行扩展,就很容易出现类爆炸的情况,这个时候使用桥接模式,可以很好的应对这种情况

传统方式的源码可以去git查看,这里就不贴了

桥接模式的类图

img

可以看到解锁抽象类当作桥,用于连接支付接口,扩展十分方便

Java实现

支付接口

1
2
3
public interface IPay {
void pay();
}

wx支付

1
2
3
4
5
6
public class WXPay implements IPay {
@Override
public void pay() {
System.out.println("wx支付");
}
}

zfb支付

1
2
3
4
5
6
public class ZFBPay implements IPay {
@Override
public void pay() {
System.out.println("支付宝支付");
}
}

解锁抽象类

1
2
3
4
5
6
7
public abstract class PayType {
protected IPay iPay;
public PayType(IPay iPay) {
this.iPay = iPay;
}
public abstract void pay();
}

人脸解锁

1
2
3
4
5
6
7
8
9
10
11
12
public class FacePay extends PayType {

public FacePay(IPay iPay) {
super(iPay);
}

@Override
public void pay() {
iPay.pay();
System.out.println("人脸识别");
}
}

指纹解锁

1
2
3
4
5
6
7
8
9
10
11
12
public class FingerPay extends PayType {

public FingerPay(IPay iPay) {
super(iPay);
}

@Override
public void pay() {
iPay.pay();
System.out.println("指纹识别");
}
}

client测试

1
2
3
4
5
6
7
8
PayType p = new FacePay(new WXPay());
p.pay();
PayType p1 = new FacePay(new ZFBPay());
p1.pay();
PayType p2 = new FingerPay(new WXPay());
p2.pay();
PayType p3 = new FingerPay(new ZFBPay());
p3.pay();