桥接模式概念

桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

较为通俗的概念

1
将抽象与实现分离,使它们可以独立变化。使用组合的方式替代替代继承的方式实现实现解耦和复用

继承的弊端(局限)

继承好处

  1. 提高了代码的复用性(多个类相同的成员可以放到同一个类里)
  2. 提高了代码的维护性(如果放大的代码需要修改,修改一处就行)

继承弊端

  1. 继承让类与类之间产生了关系,增强了类的耦合性。

继承弊端的案例

如下描述:

需要实现一个支付系统,系统目前划分两种支付渠道,但是后续还有可能有其他类型支付。支付方式有密码和指纹,后续也可加入刷脸等支付方式

  1. 微信支付
    1.1 密码支付
    1.2 指纹支付
    1.3 xxxx
  2. 支付宝支付
    2.1 密码支付
    2.2 指纹支付
    3.3 xxxx
  3. 其他支付渠道

开始实施时,如果支付渠道和方式的分类都已知,可以写一个支付类,并且支付方式里通过参数对支付方式和渠道进行分支判断,去实行不同的支付方式。但是到了后期,支付渠道和方式的增加,我们需要修改原先代码,久而久之,代码里充满了分支语句,难以维护。其次如果这样编写逻辑那么M(支付渠道) x N(支付方式)中实现方式。

这样的情况不是我们想看到的,如何解决呐? 可以使用组合的方式解决这个问题,这也是桥接模式的核心。

桥接模式(组合)

把支付方式和渠道其中一个抽离出来(这里把支付方式提取出来,但是形成一个类),使两者分开。并在支付渠道中引入支付方式。如下(这里的payMode变量就抽象理解成两种之间的桥梁,所以称为桥梁模式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class payChannel {
payMode
constructor(payMethod){
this.payMode = payMethod;
}

payHandle(){
this.payMode.pay();
}
}

class payMethod {

// 支付
pay(){}
}

new payChannel(new payMethod())

typescript version

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

class payChannel {
protected payMode: payMode
constructor(payMethod){
this.payMode = payMethod;
}

payHandle(){
this.payMode.pay();
}
}

// 支付方式接口
export interface payMode {
pay(): string;
}

class payMethod implements payMode {

// 支付
pay(){}
}

new payChannel(new payMethod())

接下实现M(支付渠道) + N(支付方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class payChannel {
payMode
constructor(payMethod){
this.payMode = payMethod;
}

payHandle(){
this.payMode.pay();
}
}

class wechatChannel extends payChannel {
payHandle(): string {
const payRes = this.payMode.pay();
return `微信-${payRes}`;
}
}

class payMethod {

// 普通支付
pay(){}
}

class passwordPayMethod {

// 密码支付
pay(){}
}

new wechatChannel(new payMethod());
new wechatChannel(new passwordPayMethod())

本文文献参考

  1. 冒号课堂-编程范式与OOP思想
  2. 设计模式-桥接(Bridge)Bridge
  3. 设计模式之桥接模式详解设计模式之桥接模式详解